あるいは、マイクロソフトはどのようにしてタイムトラベルを可能にしたのですか?
このコードを考えてみましょう:
DECLARE @Offset datetimeoffset = sysdatetimeoffset();
DECLARE @UTC datetime = getUTCdate();
DECLARE @UTCFromOffset datetime = CONVERT(datetime,SWITCHOFFSET(@Offset,0));
SELECT
Offset = @Offset,
UTC = @UTC,
UTCFromOffset = @UTCFromOffset,
TimeTravelPossible = CASE WHEN @UTC < @UTCFromOffset THEN 1 ELSE 0 END;
@Offset
はの前 @UTC
に設定されますが、後の値になることもあります。(私はSQL Server 2008 R2とSQL Server 2016でこれを試しました。疑わしい出来事をキャッチするには、数回実行する必要があります。)
これは、単に丸めや精度の欠如の問題であるようには見えません。(実際、丸めは時々問題を「修正」するものだと思います。)サンプル実行の値は次のとおりです。
- オフセット
- 2017-06-07 12:01:58.8801139 -05:00
- UTC
- 2017-06-07 17:01:58.877
- オフセットからのUTC:
- 2017-06-07 17:01:58.880
したがって、日時の精度では、.880を有効な値として使用できます。
でも、MicrosoftのGETUTCDATE例は、 SYS *値があることを示し、後に選択されているにもかかわらず、古い方法よりも早く:
SELECT 'SYSDATETIME() ', SYSDATETIME(); SELECT 'SYSDATETIMEOFFSET()', SYSDATETIMEOFFSET(); SELECT 'SYSUTCDATETIME() ', SYSUTCDATETIME(); SELECT 'CURRENT_TIMESTAMP ', CURRENT_TIMESTAMP; SELECT 'GETDATE() ', GETDATE(); SELECT 'GETUTCDATE() ', GETUTCDATE(); /* Returned: SYSDATETIME() 2007-05-03 18:34:11.9351421 SYSDATETIMEOFFSET() 2007-05-03 18:34:11.9351421 -07:00 SYSUTCDATETIME() 2007-05-04 01:34:11.9351421 CURRENT_TIMESTAMP 2007-05-03 18:34:11.933 GETDATE() 2007-05-03 18:34:11.933 GETUTCDATE() 2007-05-04 01:34:11.933 */
これは、根本的なシステム情報が異なるためだと思います。誰かが詳細を確認して提供できますか?
MicrosoftのSYSDATETIMEOFFSETのドキュメントは、(感謝srutzky)「SQL ServerがGetSystemTimeAsFileTime()は、Windows APIを使用して、日付と時刻の値を取得」と言うが、そのGETUTCDATEのドキュメントは、「値がのオペレーティングシステムに由来していることだけ言って、あまり具体的ですSQL Serverのインスタンスが実行されているコンピューター」。
(これは完全に学術的なものではありません。これによって引き起こされた小さな問題に遭遇しました。将来の精度向上を期待して、GETUTCDATEの代わりにSYSDATETIMEOFFSETを使用するようにいくつかのプロシージャをアップグレードしましたが、他のプロシージャがまだGETUTCDATEを使用しており、変換されたプロシージャのログを時折「ジャンプ」します。)