FUNCTION uf_hxsj(@uf_id int) RETURNS int AS begin declare @re_sj int select @re_sj= ISNULL( DATEDIFF( hour,a.zhyzlssj , case when a.sjdgsj = ( select max(c.sjdgsj) from jzx_cbgl_cbdt_khdgb c where c.hcbm = a.hcbm ) then dbo.uf_last_hxsj(a.hcbm) else (SELECT MIN(e.sjdgsj) FROM jzx_cbgl_cbdt_khdgb e WHERE e.sjdgsj > a.sjdgsj and e.hcbm = a.hcbm ) end), 0) from jzx_cbgl_cbdt_khdgb a where a.id = @uf_id return case when @re_sj< 0 then 0 else @re_sj end end函数是为了返回一个时间,逻辑也没有什么错误
你在调用函数的时候要:dbo.funName()
dbo.uf_last_hxsj 这个函数也拿出来看看啊!
FUNCTION uf_last_hxsj(@hxid integer) RETURNS datetime AS begin --找到同一搜船的下一个航线ID --先得到船舶名称航次的最后一条记录的时间 --再跟据时间查找是否存在第一个比此时间大的记录 --存在,返回hxid 不存在返回0 declare @cb varchar(10) declare @dt datetime declare @ret datetime set @ret = '1900-1-1' select @cb = max(cbhh),@dt = max(sjdgsj) from jzx_cbgl_cbdt_khdgb where hcbm = @hxid select @ret = min(sjdgsj) from jzx_cbgl_cbdt_khdgb where sjdgsj > @dt and cbhh = @cb and jjgbz = 1 return case when @ret>@dt then @ret else @dt end end
并且还有个问题,当成这个问题问了吧! 如果放在视图中,就要牵扯到返回值小于零的情况,我用 ※※※※※ 表示刚刚的长代码 由于※※※※※会小于零,这个数值是航线时间,肯定不能小于零,因此要进行一次小于零就付零的过程,这就是我用函数的原因, 但是如果我写成 case when ※※※※※ < 0 then 0 else ※※※※※end 肯定可以解决问题,但是带来的就是代码的长度和计算两次的问题,对于1000行记录尚可忍受,如果…… 所以,大家有什么好办法解决 这样的东西呢?
而且这个函数也没有什么问题
RETURNS int AS
begin
declare @re_sj int
select @re_sj= ISNULL( DATEDIFF( hour,a.zhyzlssj , case when a.sjdgsj =
( select max(c.sjdgsj) from jzx_cbgl_cbdt_khdgb c where c.hcbm = a.hcbm )
then dbo.uf_last_hxsj(a.hcbm)
else (SELECT MIN(e.sjdgsj) FROM jzx_cbgl_cbdt_khdgb e
WHERE e.sjdgsj > a.sjdgsj and e.hcbm = a.hcbm ) end), 0)
from jzx_cbgl_cbdt_khdgb a
where a.id = @uf_id
return case when @re_sj< 0 then 0 else @re_sj end
end函数是为了返回一个时间,逻辑也没有什么错误
这个函数也拿出来看看啊!
RETURNS datetime AS
begin
--找到同一搜船的下一个航线ID
--先得到船舶名称航次的最后一条记录的时间
--再跟据时间查找是否存在第一个比此时间大的记录
--存在,返回hxid 不存在返回0
declare @cb varchar(10)
declare @dt datetime
declare @ret datetime
set @ret = '1900-1-1'
select @cb = max(cbhh),@dt = max(sjdgsj)
from jzx_cbgl_cbdt_khdgb
where hcbm = @hxid
select @ret = min(sjdgsj)
from jzx_cbgl_cbdt_khdgb where sjdgsj > @dt and cbhh = @cb and jjgbz = 1
return case when @ret>@dt then @ret else @dt end
end
如果放在视图中,就要牵扯到返回值小于零的情况,我用 ※※※※※ 表示刚刚的长代码 由于※※※※※会小于零,这个数值是航线时间,肯定不能小于零,因此要进行一次小于零就付零的过程,这就是我用函数的原因,
但是如果我写成 case when ※※※※※ < 0 then 0 else ※※※※※end 肯定可以解决问题,但是带来的就是代码的长度和计算两次的问题,对于1000行记录尚可忍受,如果……
所以,大家有什么好办法解决 这样的东西呢?