2012-06-29 10 views
12

この週末は、6月30日に23:59:59の後にextra secondが挿入されるため、余分な長いものです。SQL Server 2008にうるう秒を格納

私たちには、24時間にわたって多くのデータを記録するシステムがあります。ビジネスルールの1つは、2つのレコードが同時に発生したと記録できないことです.1秒以内です。

新しいdatetimeoffsetデータ型とともにUTCのdatetimesを使用していますが、分かりやすい限り、1分で60秒以上は使用できません。

確かに、これはエラーをスローします。

select datediff(ss, getdate(), '30-jun-2012 23:59:60') 

しかし、UTCの神々によれば、これは本当の時間になります。イベントは23:59:60で行うことができますが、この事実を記録する方法はありません。

23:59:59さらに1秒オフセットは、7月1日にはまだ00:00:00とみなされます。

データベースで23:59:60にイベントが発生したことを正しく記録するにはどうすればよいですか?

+4

ビジネスルールは現実を無視しているようです。 –

+1

どのようにそうですか?ログに記録されるイベントは、1秒に1回以上物理的に発生することはできません。あなたが同じプロジェクトに取り組んでいることは気づいていませんでした。 – Widor

+1

私は冗談で話していましたが、実際にはシステムがうるう秒のタイムスタンプを保存できないため、うるう秒の間に1秒あたり1つのイベントを記録することはできません。ビジネスルールは、従来の手段では容易には対応できないものを求めています。規則を見直したり、うるう秒を例外にしたり、狂った一回限りのコードを書いたりしてください。 –

答えて

9

SQLはWindowsから時刻を取得し、Windowsはうるう秒もサポートしないため、できません。

Windowsでは、アップストリームのタイムサーバーから新しい時刻を取得し、通常の調整を単純なものとして適用して、うるう秒を適用しますclock drift

通常、これは長期間に渡って数ナノ秒単位で各秒を調整することを意味します。 24時間以上経過すると、毎分約1ミリ秒で動作します。 http://technet.microsoft.com/en-us/library/cc773013(v=ws.10).aspx

基本的には、ほとんどのアプリケーションは、単純なものが存在しないことをふり:Windowsタイムサービスの動作がどのようにhttp://support.microsoft.com/kb/909614

  • Does the windows FILETIME structure include leap seconds?
  • :Windowsタイムサービスは、うるう秒をどのように扱うか

    • うるう秒として。

      ほとんどの場合、これは問題ではありません。この問題が発生するアプリケーションがある場合、OSはあなたを助けません。 OSは一般的に時間を1秒以内に維持するのに問題があるため、時間を追跡するための特別なハードウェアも必要になります。 Windowsでは、デフォルトで週に1回またはそれ以下の時間が同期され、最も安価なPCのハードウェアクロック(または高価なサーバーでさえも)は、その時間に数秒間簡単にドリフトする可能性があります。

      正確な時刻を気にするので、pool.ntp.orgまたは地域のサブネットを指していて、同期のために1日に数回w32timeを設定していると仮定します。

  • +0

    次回のntp同期で時刻を調整することで、時計が遅くなり、将来のシステムに統合できるようになることに注意してください:)ところで、時計が遠すぎると、したがって、データベース内の重複するエントリで同じ問題が発生します。 MSDN: "... ...クロックレートを調整して、正しい時間に収束させます。時間差が大きすぎると...タイムサービスがローカルクロックを設定します...](https ://technet.microsoft.com/en-us/library/cc773013(v= ws.10).aspx#w2k3tr_times_how_izcr) " – eFloh

    関連する問題