sql >> Database >  >> RDS >> Sqlserver

Een Unix-tijdstempel converteren naar een datum/tijd-waarde in SQL Server

In SQL Server kunnen we de volgende methode gebruiken om een ​​datum en tijd te retourneren op basis van een gegeven Unix-tijdstempel.

De Unix-tijdstempel (ook bekend als Unix Epoch-tijd, Unix-tijd of POSIX-tijd) is het aantal seconden dat is verstreken sinds 00:00:00 donderdag 1 januari 1970 Coordinated Universal Time (UTC).

Voorbeeld

Hier is een voorbeeld van het converteren van een Unix-tijdstempel naar een datum/tijd-waarde:

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

Resultaat:

2028-12-20 14:25:19.000

In dit geval was de Unix-tijdstempel 1860935119, wat zich vertaalde in een datum en tijd van 2028-12-20 14:25:19.000.

Huidige datum/tijd

Hier is een voorbeeld dat de Unix-tijdstempel gebruikt op basis van de huidige datum/tijd:

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

Resultaat:

2022-04-18 00:31:46.000

Let wel, dit is overbodig, want we hadden gewoon het volgende kunnen doen:

SELECT GETUTCDATE();

Grotere Unix-tijdstempels

Wanneer geconfronteerd met een grotere Unix-tijdstempelwaarde zoals de volgende:

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

We kunnen een overloopfout krijgen zoals deze:

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

Dat komt omdat de Unix-tijdstempelwaarde groter is dan wat een geheel getal kan bevatten. Deze Unix-tijdstempel bevat een precisie van nanoseconden en heeft te veel cijfers voor een geheel getal.

We hebben een aantal opties om hiermee om te gaan. Een optie is om de precisie te verminderen:

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

Resultaat:

2029-03-11 09:09:22.000

Hier gebruikten we de LEFT() functie om alleen de eerste tien cijfers terug te geven, evenals de CONVERT() functie om een ​​geheel getal terug te geven.

Als we de precisie niet willen verminderen, kunnen we zoiets als dit doen:

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

Resultaat:

2029-03-11 09:09:22.7158769

  1. Conditional Split Transformation:gegevens exporteren van SQL Server naar Oracle- en MySQL-databases

  2. pyodbc kan geen verbinding maken met de database

  3. Percona XtraDB-cluster bewaken - belangrijkste meetgegevens

  4. Vind alle zoekopdrachten die een bepaalde tabel gebruiken