1

以前の投稿では、日付を現在の日付に変更し、8時間を追加しようとしました。

SQL Server:今日に変換してから8時間を追加

UPDATE business.dbo.db_schedule
SET nextUpdate= DATEADD(hh, 8,
                DATEADD(d, DATEDIFF(D,nextUpdate,Getdate()),
                          nextUpdate))
where sno=8

注:nextUpdateは、過去の任意の時点である可能性があります。

さらに一歩進みたい場合。nextdateを将来的にしたいです。8時間を1回追加すると、結果はまだ過去の時間である可能性があるため、結果が将来になるように、もう1つ(または2回)追加する必要がある場合があります。ワンステップでできますか?

4

2 に答える 2

3
UPDATE business.dbo.db_schedule
SET nextUpdate =
  DATEADD(HOUR
    , 8 * CEILING((DATEDIFF(MILLISECOND, nextUpdate, GETDATE()) / 3600000.) / 8.)
    , nextUpdate)
  )
WHERE sno = 8;

単に8時間を追加するのではなく、8にCELING次の時間数を掛けnextUpdateます。GETDATE()

たとえば、現在および現在の場合nextUpdate2012-10-01 02:30:0036.75 GETDATE()2012-10-02 15:15:0037に切り上げ)の時間差があります。37/8のは5です。つまり、現在の値から8時間の倍数を保持したCEILING後の時間を取得するには、5*8時間を追加する必要があります。GETDATE()nextUpdate

ソリューションのSQLFiddleの例

于 2012-10-02T04:32:15.860 に答える
1

これは、多くのことを確認する必要がありますが、データを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;
于 2012-10-02T06:21:02.660 に答える