私たちのシステムでは、ユーザーのためのシフトを作成するストアドプロシージャがあります。これらのシフトには、指定された開始/終了時間と継続時間があります。これらのシフトがDST境界を越えると、継続時間が正しく表示されません。以下の例を見てみましょう:SQL DSTの境界を越える時間(時間)を計算する
declare @start DATETIME = '2017-03-11 22:00:00.000',
@end DATETIME = '2017-03-12 06:00:00.000'
select (DATEDIFF(hh, @start, @end)) as 'Elapsed Hours'
これは8時間の経過時間を返します。しかし、今年の3月12日にDSTが始まり、時計は1時間前に移動します。したがって、実際の経過時間はわずか7です。SQL 2016ではAT TIME ZONE
関数を使用してこれを回避できますが、残念ながらSQL 2008 - 2016ではこれをサポートする必要があります。
How to create Daylight Savings time Start and End function in SQL Server これらの関数を使用してDSTの開始日と終了日を取得し、シフトがこれらの境界線の1つを越えているかどうかを確認してから適切なオフセットを適用することができます私には醜い選択肢のように。まず、すべての場所でDSTが監視されているわけではなく、すべての国で同じDSTスケジュールが使用されているわけではありません...だから、これを行うにはより良い方法が必要だと考えています。コミュニティの他の誰もがこの問題を抱えていて、それを処理するためのよりよい方法を見つけましたか?
11月の最初の日曜日の01:30の意味を決して決して決して保証することはできません(コンテキストが米国の場合を想定)。あなたが「転倒」すると、現地時間に基づいて並べ替えることができない重複時間が1時間あります。 – HABO
それは良い質問です。私は1:30のことを心配する必要があるとは思わない。しかし、その期間中にアプリケーションがどのように動作するかを調べるには、そのことを調べる必要があります。 – Nathan24
OK、いいえ、私たちはその意味を心配する必要はありません。これは、作業時間のシフト/スケジュールのすべてのロジックなので。 DSTの02:00のカットオーバーの前にシフトが終了するため、DSTの変更日であっても、その年の任意の日に22:00〜01:30に働く人は、常に3.5時間しか働かないでしょう。余分な時間を費やさなければならないか、1時間以下しか働かないため、誰かがその境界線を越えて働くときにのみ作用します。 – Nathan24