SQL Serverでは、次のメソッドを使用して、指定されたUnixタイムスタンプに基づいて日付と時刻を返すことができます。
Unixタイムスタンプ(Unixエポック時間、Unix時間、またはPOSIX時間とも呼ばれます)は、1970年1月1日木曜日の00:00:00、協定世界時(UTC)から経過した秒数です。
例
Unixタイムスタンプを日付/時刻値に変換する例を次に示します。
SELECT DATEADD(s, 1860935119, '1970-01-01');
結果:
2028-12-20 14:25:19.000
この場合、UNIXタイムスタンプは1860935119であり、これは2028-12-20 14:25:19.000の日付と時刻に変換されました。
現在の日付/時刻
現在の日付/時刻に基づいてUnixタイムスタンプを使用する例を次に示します。
SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');
結果:
2022-04-18 00:31:46.000
念のために言っておきますが、これは不要です。次のことを実行できたはずだからです。
SELECT GETUTCDATE();
より大きなUnixタイムスタンプ
次のような大きなUnixタイムスタンプ値に直面した場合:
SELECT DATEADD(s, 1867914562715876900, '1970-01-01');
次のようなオーバーフローエラーが発生する可能性があります:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
これは、Unixタイムスタンプの値が整数が保持できる値よりも大きいためです。このUnixタイムスタンプにはナノ秒の精度が含まれており、整数に対して桁数が多すぎます。
これに対処するためのいくつかのオプションがあります。 1つのオプションは、精度を下げることです。
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');
結果:
2029-03-11 09:09:22.000
ここでは、LEFT()
を使用しました 最初の10桁だけを返す関数と、CONVERT()
整数を返す関数。
精度を下げたくない場合は、次のようにすることができます:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
ns,
@ts % 1000000000,
DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
);
結果:
2029-03-11 09:09:22.7158769