2017-02-10 6 views
2

私たちのシステムでは、ユーザーのためのシフトを作成するストアドプロシージャがあります。これらのシフトには、指定された開始/終了時間と継続時間があります。これらのシフトが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スケジュールが使用されているわけではありません...だから、これを行うにはより良い方法が必要だと考えています。コミュニティの他の誰もがこの問題を抱えていて、それを処理するためのよりよい方法を見つけましたか?

+1

11月の最初の日曜日の01:30の意味を決して決して決して保証することはできません(コンテキストが米国の場合を想定)。あなたが「転倒」すると、現地時間に基づいて並べ替えることができない重複時間が1時間あります。 – HABO

+0

それは良い質問です。私は1:30のことを心配する必要があるとは思わない。しかし、その期間中にアプリケーションがどのように動作するかを調べるには、そのことを調べる必要があります。 – Nathan24

+0

OK、いいえ、私たちはその意味を心配する必要はありません。これは、作業時間のシフト/スケジュールのすべてのロジックなので。 DSTの02:00のカットオーバーの前にシフトが終了するため、DSTの変更日であっても、その年の任意の日に22:00〜01:30に働く人は、常に3.5時間しか働かないでしょう。余分な時間を費やさなければならないか、1時間以下しか働かないため、誰かがその境界線を越えて働くときにのみ作用します。 – Nathan24

答えて

2

異なる場所でDSTスケジュールで特定された不確実性のため、すべての日時計算をUTCで行い、クライアントの現地時間で表示することが推奨されることがよくあります。 DSTのルールは、地方の法律に基づいていつでも変更することができます。都市間でも、UTCは時間を計算する最良の方法です。

追加の明確化のための編集:SQL2016修正プログラムでも、人間の介入とルールの更新に依存して、各国、州、および都市がDSTの法律を変更しても最新の状態に保たれます。 UTCは、一貫して信頼性の高い最高のツールです。

+0

これは私が同意できるものです。残念ながら私たちのソフトウェアでは、すべての時間が現地時間を使用してデータベースに保存されているという考え方があります。それをUTCに変更するのは簡単な作業ではありません。 – Nathan24

+0

@Nathan、それは残念です。これは責任ツリーの上に情報を移動して他の誰かの問題にすることができる状況ですか?あるいは、少なくとも、サーバーのアップグレードや複雑な機能を使っても、nonUTCメソッドは「かなり良い」ことだけを知らせることができます。 – Forklift

+0

ええ、私は本当に誰か他の人の問題にすることはできません。 3月にDSTが始まる前に修正できるものを特定するのは私の責任です。幸運なことに、私たちのクライアントの大部分はすべて米国のベースです。アリゾナのクライアント、またはDSTを監視しない他の同様のロケールのクライアントにオーバーライドフラグを追加することができます。しかし、「Pretty Good」オプションを使用する必要があるように見えます。これにより、将来UTCメソッドへのリファクタリングを行うことができます。 – Nathan24