V SQL Server můžeme použít následující metodu k vrácení data a času na základě daného unixového časového razítka.
Unixové časové razítko (také známé jako Unix Epoch time, Unix time nebo POSIX time) je počet sekund, které uplynuly od 00:00:00 čtvrtek 1. ledna 1970 koordinovaného světového času (UTC).
Příklad
Zde je příklad převodu časového razítka Unix na hodnotu data/času:
SELECT DATEADD(s, 1860935119, '1970-01-01');
Výsledek:
2028-12-20 14:25:19.000
V tomto případě bylo unixové časové razítko 1860935119, což bylo převedeno na datum a čas 2028-12-20 14:25:19.000.
Aktuální datum/čas
Zde je příklad, který používá časové razítko Unix na základě aktuálního data/času:
SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');
Výsledek:
2022-04-18 00:31:46.000
Uvědomte si, že je to zbytečné, protože jsme mohli udělat následující:
SELECT GETUTCDATE();
Větší časová razítka Unix
Když se setkáte s větší hodnotou časového razítka Unix, jako je následující:
SELECT DATEADD(s, 1867914562715876900, '1970-01-01');
Mohli bychom dostat chybu přetečení, jako je tato:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
Je to proto, že hodnota časového razítka Unixu je větší, než jaké může obsahovat celé číslo. Toto unixové časové razítko obsahuje nanosekundovou přesnost a má příliš mnoho číslic na celé číslo.
Máme několik možností, jak se s tím vypořádat. Jednou z možností je snížit přesnost:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');
Výsledek:
2029-03-11 09:09:22.000
Zde jsme použili LEFT()
funkce vrátí pouze prvních deset číslic a také CONVERT()
funkce pro vrácení celého čísla.
Pokud nechceme snižovat přesnost, můžeme udělat něco takového:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
ns,
@ts % 1000000000,
DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
);
Výsledek:
2029-03-11 09:09:22.7158769