Jak przekonwertować znacznik czasu UNIX (bigint) na DateTime w SQL Server?
sql
sql-server
datetime
unix-timestamp
Salman
źródło
źródło
To zadziałało dla mnie:
W przypadku gdyby ktoś się zastanawiał, dlaczego 1970-01-01 nazywa się to czasem Epoki .
Poniżej cytat z Wikipedii:
źródło
Jeśli ktoś otrzyma poniższy błąd:
ponieważ unix timestamp jest w bigint (zamiast int), możesz użyć tego:
Zastąp zakodowany na stałe znacznik czasu dla swojej rzeczywistej kolumny na unix-timestamp
Źródło: MSSQL bigint Unix Timestamp to Datetime z milisekundami
źródło
Lubię to
dodaj uniksową (epokową) datę i godzinę do daty bazowej w sekundach
to na razie to dostanie (2010-05-25 07: 56: 23.000)
Jeśli chcesz cofnąć, spójrz na to http://wiki.lessthandot.com/index.php/Epoch_Date
źródło
To zrobi to:
Zamiast! Precyzji! użyj: ss, ms lub mcs zgodnie z dokładnością znacznika czasu. Bigint jest w stanie utrzymać mikrosekundową precyzję.
źródło
Sprawdź to:
Serwer SQL:
Serwer MySql:
http://www.w3resource.com/mysql/date-and-time-functions/mysql-from_unixtime-function.php
źródło
Dodanie n sekund do
1970-01-01
da ci datę UTC, ponieważ n , znacznik czasu uniksowego, to liczba sekund, które upłynęły od 00:00:00 uniwersalnego czasu koordynowanego (UTC), czwartek, 1 stycznia 1970 r .W programie SQL Server 2016 można przekonwertować jedną strefę czasową na inną za pomocą
AT TIME ZONE
. Wystarczy znać nazwę strefy czasowej w standardowym formacie Windows:Lub po prostu:
Uwagi:
DATETIMEOFFSET
doDATETIME
.źródło
Jeśli czas jest w milisekundach i trzeba je zachować:
źródło
Jest to kontynuacja pracy, którą Daniel Little wykonał dla tego pytania, ale biorąc pod uwagę czas letni (działa dla dat 01-01 1902 i większych ze względu na ograniczenie int w funkcji dateadd):
Najpierw musimy utworzyć tabelę, która będzie przechowywać zakresy dat dla czasu letniego (źródło: Historia czasu w Stanach Zjednoczonych ):
Teraz tworzymy funkcję dla każdej amerykańskiej strefy czasowej. Zakłada się, że czas unixa jest w milisekundach. Jeśli zajmie to kilka sekund, usuń / 1000 z kodu:
Pacyfik
Wschodni
Centralny
Góra
Hawaje
Arizona
Alaska
źródło
źródło
Z tym problemem też musiałem się zmierzyć. Niestety żadna z odpowiedzi (tutaj i na kilkudziesięciu innych stronach) nie była dla mnie satysfakcjonująca, ponieważ nadal nie mogę dotrzeć do dat wykraczających poza rok 2038 ze względu na gdzieś rzutowanie 32-bitowych liczb całkowitych.
Rozwiązaniem, które ostatecznie zadziałało, było użycie
float
zmiennych, więc mogłem mieć przynajmniej maksymalną datę2262-04-11T23:47:16.854775849
. Nie obejmuje to jednak całejdatetime
domeny, ale jest wystarczające dla moich potrzeb i może pomóc innym napotkać ten sam problem.Należy wziąć pod uwagę kilka kwestii:
@ticksofday
pierwszą linię algorytmu.1900-01-01
jest datą powstaniadatetime2
, tak samo jak epoką1970-01-01
dla uniksowych znaczników czasu.float
s pomogło mi rozwiązać problem z roku 2038 i przepełnienia liczb całkowitych i tym podobne, ale pamiętaj, że liczby zmiennoprzecinkowe nie są zbyt wydajne i mogą spowolnić przetwarzanie dużej liczby znaczników czasu. Ponadto wartości zmiennoprzecinkowe mogą prowadzić do utraty precyzji z powodu błędów zaokrągleń, co widać w porównaniu przykładowych wyników dla daty maksymalnej powyżej (tutaj błąd wynosi około 1,4425 ms).datetime
. Niestety, nie ma jawnego rzutowania z wartości liczbowych nadatetime2
dozwolone, ale dozwolone jest rzutowanie liczb nadatetime
jawnie, a to z kolei jest rzutowane niejawnie nadatetime2
. Na razie może to być poprawne, ale może się zmienić w przyszłych wersjach programu SQL Server: albo będzie dostępnadateadd_big()
funkcja, albodatetime2
dozwolone będzie jawne rzutowanie lub niedozwolone będzie jawne rzutowaniedatetime
, więc może się zepsuć lub może nadejść Któregoś dnia łatwiejszy sposób.źródło
Oto najprostszy sposób dla GMT:
źródło
Lepszy? Ta funkcja konwertuje czas unixtime w milisekundach na datę i godzinę. Traciło milisekundy, ale nadal jest bardzo przydatne do filtrowania.
źródło
Rozwiązanie może być następujące:
źródło
@DanielLittle ma najłatwiejszą i najbardziej elegancką odpowiedź na konkretne pytanie. Jeśli jednak interesuje Cię konwersja do określonej strefy czasowej ORAZ uwzględnienie czasu letniego (DST), poniższe rozwiązania działają dobrze:
Uwaga: to rozwiązanie działa tylko w programie SQL Server 2016 i nowszych wersjach (oraz na platformie Azure).
Aby utworzyć funkcję:
Możesz wywołać funkcję w ten sposób:
źródło