sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man konverterar en Unix-tidsstämpel till ett datum-/tidsvärde i SQL Server

I SQL Server kan vi använda följande metod för att returnera ett datum och en tid baserat på en given Unix-tidsstämpel.

Unix-tidsstämpeln (även känd som Unix Epoch-tid, Unix-tid eller POSIX-tid) är antalet sekunder som har förflutit sedan 00:00:00 torsdagen den 1 januari 1970, Coordinated Universal Time (UTC).

Exempel

Här är ett exempel på att konvertera en Unix-tidsstämpel till ett datum-/tidsvärde:

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

Resultat:

2028-12-20 14:25:19.000

I det här fallet var unix-tidsstämpeln 1860935119, vilket översattes till datum och tid 2028-12-20 14:25:19.000.

Aktuellt datum/tid

Här är ett exempel som använder Unix-tidsstämpeln baserat på aktuellt datum/tid:

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

Resultat:

2022-04-18 00:31:46.000

Tänk på att detta är överflödigt, eftersom vi bara kunde ha gjort följande:

SELECT GETUTCDATE();

Större Unix-tidsstämplar

När du står inför ett större Unix-tidsstämpelvärde som följande:

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

Vi kan få ett overflow-fel som detta:

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

Det beror på att Unix-tidsstämpelvärdet är större än vad ett heltal kan hålla. Denna Unix-tidsstämpel innehåller nanosekundprecision och har för många siffror för ett heltal.

Vi har ett par alternativ för att hantera detta. Ett alternativ är att minska precisionen:

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

Resultat:

2029-03-11 09:09:22.000

Här använde vi LEFT() funktion för att returnera bara de första tio siffrorna, samt CONVERT() funktion för att returnera ett heltal.

Om vi ​​inte vill minska precisionen kan vi göra något så här:

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

Resultat:

2029-03-11 09:09:22.7158769

  1. Exportera SQLite-databas till XML-fil

  2. Hur söker jag efter en sträng i en SQL Server-databas?

  3. Förstå PIVOT-, UNPIVOT- och Reverse PIVOT-satser

  4. Ställa in ODBC-anslutningsattribut utan att behöva skriva kod