Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So konvertieren Sie einen Unix-Zeitstempel in einen Datums-/Uhrzeitwert in SQL Server

In SQL Server können wir die folgende Methode verwenden, um ein Datum und eine Uhrzeit basierend auf einem bestimmten Unix-Zeitstempel zurückzugeben.

Der Unix-Zeitstempel (auch bekannt als Unix-Epochenzeit, Unix-Zeit oder POSIX-Zeit) ist die Anzahl der Sekunden, die seit Donnerstag, 1. Januar 1970, 00:00:00 Uhr, Koordinierte Weltzeit (UTC) verstrichen sind.

Beispiel

Hier ist ein Beispiel für die Umwandlung eines Unix-Zeitstempels in einen Datums-/Uhrzeitwert:

SELECT DATEADD(s, 1860935119, '1970-01-01');

Ergebnis:

2028-12-20 14:25:19.000

In diesem Fall war der Unix-Zeitstempel 1860935119, was in Datum und Uhrzeit 2028-12-20 14:25:19.000 übersetzt wurde.

Aktuelles Datum/aktuelle Uhrzeit

Hier ist ein Beispiel, das den Unix-Zeitstempel basierend auf dem aktuellen Datum/der aktuellen Uhrzeit verwendet:

SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');

Ergebnis:

2022-04-18 00:31:46.000

Wohlgemerkt, das ist überflüssig, denn wir hätten einfach Folgendes tun können:

SELECT GETUTCDATE();

Größere Unix-Zeitstempel

Wenn Sie mit einem größeren Unix-Zeitstempelwert wie dem folgenden konfrontiert werden:

SELECT DATEADD(s, 1867914562715876900, '1970-01-01');

Wir könnten einen Überlauffehler wie diesen bekommen:

Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.

Das liegt daran, dass der Unix-Zeitstempelwert größer ist als das, was eine Ganzzahl enthalten kann. Dieser Unix-Zeitstempel enthält Nanosekunden-Präzision und hat zu viele Ziffern für eine Ganzzahl.

Wir haben ein paar Möglichkeiten, damit umzugehen. Eine Möglichkeit besteht darin, die Genauigkeit zu verringern:

DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');

Ergebnis:

2029-03-11 09:09:22.000

Hier haben wir LEFT() verwendet Funktion, um nur die ersten zehn Ziffern zurückzugeben, sowie CONVERT() Funktion, um eine Ganzzahl zurückzugeben.

Wenn wir die Genauigkeit nicht reduzieren wollen, können wir so etwas tun:

DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
    ns, 
    @ts % 1000000000, 
    DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
    );

Ergebnis:

2029-03-11 09:09:22.7158769