12

今週末は、6 月 30 日の後に追加の秒が挿入されるため、非常に長い週末になります。23:59:59

24 時間体制で大量のデータをログに記録するシステムがあり、ビジネス ルールの 1 つは、1 秒以内に 2 つのレコードが同時に発生したとしてログに記録できないことです。

新しいデータ型とともに UTC 日時を使用していますdatetimeoffsetが、私が知る限り、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

9

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

Windows は、アップストリーム タイム サーバーから新しい時間を取得し、単純なクロック ドリフトであるかのように通常の調整を適用することで、うるう秒を適用します。

通常、これは、長期間にわたって各秒を数ナノ秒単位で調整することを意味します。24 時間以上は、1 分あたり約 1 ミリ秒で機能します。

基本的に、ほとんどのアプリケーションはうるう秒など存在しないふりをするだけです。

ほとんどの場合、これは問題ではありません。これが重要なアプリケーションがある場合、OS は役に立ちません。また、OS は通常、時間を 1 秒以内に維持するのに問題があるため、時間を追跡するための特別なハードウェアも必要になります。デフォルトでは、Windows は毎週またはそれより少ない頻度で時刻を同期します。ほとんどの安価な PC ハードウェア クロック (または高価なサーバーのクロックでさえ) は、その時間で数秒ずれることがあります。

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

于 2012-06-29T11:42:02.850 に答える