sql >> データベース >  >> RDS >> Sqlserver

SQLServerでUnixタイムスタンプを日付/時刻値に変換する方法

    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

    1. プログラムでSQLServer接続をテストするための最良の方法は何ですか?

    2. Terraformを使用したMySQL/MariaDBVaultデータベースシークレットエンジンのプロビジョニング

    3. SQLServer2005の階層クエリ

    4. MariaDBで年、月、日を日付から分離する3つの方法