我认为这虽然有很多值得一看的地方,但实际上会表现得更好,因为它只是一次通过数据的一堆计算。
UPDATE business.dbo.db_schedule
SET nextUpdate=
CASE
WHEN
DATEADD(hh, 8, DATEADD(d, DATEDIFF(
D,nextUpdate,Getdate()), nextUpdate))
> Getdate() THEN
DATEADD(hh, 8, DATEADD(d, DATEDIFF(
D,nextUpdate,Getdate()), nextUpdate))
WHEN
DATEADD(hh, 16, DATEADD(d, DATEDIFF(
D,nextUpdate,Getdate()), nextUpdate))
> Getdate() THEN
DATEADD(hh, 16, DATEADD(d, DATEDIFF(
D,nextUpdate,Getdate()), nextUpdate))
ELSE
DATEADD(d, 1+DATEDIFF(
D,nextUpdate,Getdate()), nextUpdate)
END
where sno=8
注意:最后一个是通过在内部表达式中添加 1 天而不是在外部表达式中添加 24 小时来简化的。
原意如下
这个想法在前一个的基础上进行了扩展,只是我们不是只添加 8 小时,而是将所有 8、16和24 都添加为 3 个单独的行,并使用 GROUP BY/MIN 来获取当前时间之后最早的时间。
update s
set nextUpdate = a.newTime
from business.dbo.db_schedule s
join
(
select nextupdate, min(nextUpdate2) newTime
from
(
SELECT nextupdate,
nextUpdate2 =
DATEADD(hh, 8*x.y,
DATEADD(d,DATEDIFF(D,
d.nextUpdate,Getdate()),d.nextUpdate))
from business.dbo.db_schedule d
cross join (select 1 union all
select 2 union all
select 3) x(y)
) z
where newTime > getdate()
group by nextupdate
) a on a.nextUpdate = b.nextUpdate;