Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak przekonwertować uniksowy znacznik czasu na wartość daty/godziny w SQL Server

W SQL Server możemy użyć następującej metody, aby zwrócić datę i godzinę na podstawie podanego uniksowego znacznika czasu.

Sygnatura czasowa uniksa (znana również jako czas epoki uniksowej, czas uniksowy lub czas POSIX) to liczba sekund, które upłynęły od godziny 00:00:00 w czwartek, 1 stycznia 1970 r., uniwersalny czas koordynowany (UTC).

Przykład

Oto przykład konwersji uniksowego znacznika czasu na wartość daty/czasu:

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

Wynik:

2028-12-20 14:25:19.000

W tym przypadku uniksowy znacznik czasu to 1860935119, co oznacza datę i godzinę 2028-12-20 14:25:19.000.

Aktualna data/godzina

Oto przykład, który używa uniksowego znacznika czasu na podstawie bieżącej daty/godziny:

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

Wynik:

2022-04-18 00:31:46.000

Pamiętaj, że jest to zbyteczne, ponieważ mogliśmy po prostu wykonać następujące czynności:

SELECT GETUTCDATE();

Większe sygnatury czasowe systemu Unix

W obliczu większej wartości sygnatury czasowej uniksowej, takiej jak poniżej:

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

Możemy otrzymać taki błąd przepełnienia:

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

Dzieje się tak, ponieważ wartość znacznika czasu uniksowego jest większa niż liczba całkowita. Ten uniksowy znacznik czasu ma precyzję nanosekundową i zawiera zbyt wiele cyfr dla liczby całkowitej.

Mamy kilka możliwości radzenia sobie z tym. Jedną z opcji jest zmniejszenie precyzji:

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

Wynik:

2029-03-11 09:09:22.000

Tutaj użyliśmy LEFT() funkcja zwracająca tylko pierwsze dziesięć cyfr, a także funkcję CONVERT() funkcja zwracająca liczbę całkowitą.

Jeśli nie chcemy zmniejszać precyzji, możemy zrobić coś takiego:

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

Wynik:

2029-03-11 09:09:22.7158769

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przykłady konwersji „data” na „datetime” w SQL Server (T-SQL)

  2. Typy danych tekstowych, ntext i obrazu> nie mogą być porównywane ani sortowane, z wyjątkiem przypadku użycia operatora IS NULL lub LIKE>

  3. Jak podzielić okno zapytania w SQL Server Management Studio (SSMS) — samouczek SQL Server / TSQL część 13

  4. SQL Server Query - mnożenie grupowe

  5. Jak ustawić domyślną wartość dla istniejącej kolumny?