これは、多くのことを確認する必要がありますが、データを1回通過するだけの一連の計算であるため、実際にはパフォーマンスが向上すると思います。
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時間を追加するのではなく、内側の式に1日を追加することで簡略化されています。
以下の元のアイデア
アイデアは前のアイデアを拡張したものですが、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;