Wie kann ich einen UNIX-Zeitstempel (bigint) in SQL Server in DateTime konvertieren?
sql
sql-server
datetime
unix-timestamp
Salman
quelle
quelle
Das hat bei mir funktioniert:
Im Fall irgendwelche fragt man sich , warum 1970-01-01, Dies nennt man Epoch Zeit .
Unten ist ein Zitat aus Wikipedia:
quelle
Wenn jemand unter Fehler kommt:
Da der Unix-Zeitstempel in bigint (anstelle von int) ist, können Sie Folgendes verwenden:
Ersetzen Sie den fest codierten Zeitstempel für Ihre aktuelle Spalte durch einen Unix-Zeitstempel
Quelle: MSSQL bigint Unix-Zeitstempel zu Datetime mit Millisekunden
quelle
So was
Fügen Sie die Unix-Datumszeit (Epoche) in Sekunden zum Basisdatum hinzu
das wird es vorerst bekommen (2010-05-25 07: 56: 23.000)
Wenn Sie rückwärts gehen möchten, schauen Sie sich dieses http://wiki.lessthandot.com/index.php/Epoch_Date an
quelle
Dies wird es tun:
Anstelle von! Präzision! Verwenden Sie: ss, ms oder mcs entsprechend der Genauigkeit des Zeitstempels. Bigint ist in der Lage, Mikrosekundengenauigkeit zu halten.
quelle
Testen Sie dies:
SQL Server:
MySQL-Server:
http://www.w3resource.com/mysql/date-and-time-functions/mysql-from_unixtime-function.php
quelle
Wenn Sie n Sekunden
1970-01-01
hinzufügen, erhalten Sie ein UTC-Datum, da n , der Unix-Zeitstempel, die Anzahl der Sekunden ist, die seit 00:00:00 UTC (Coordinated Universal Time), Donnerstag, 1. Januar 1970, vergangen sind .In SQL Server 2016 können Sie mithilfe von eine Zeitzone in eine andere konvertieren
AT TIME ZONE
. Sie müssen nur den Namen der Zeitzone im Windows-Standardformat kennen:Oder einfach:
Anmerkungen:
DATETIMEOFFSET
auf abhackenDATETIME
.quelle
Wenn die Zeit in Millisekunden ist und man sie beibehalten muss:
quelle
Dies baut auf der Arbeit auf, die Daniel Little für diese Frage geleistet hat, berücksichtigt jedoch die Sommerzeit (funktioniert für Daten vom 01.01.1902 und höher aufgrund der int-Begrenzung der Dateadd-Funktion):
Wir müssen zuerst eine Tabelle erstellen, in der die Datumsbereiche für die Sommerzeit gespeichert werden (Quelle: Zeitverlauf in den USA ):
Jetzt erstellen wir eine Funktion für jede amerikanische Zeitzone. Dies setzt voraus, dass die Unix-Zeit in Millisekunden angegeben ist. Wenn es in Sekunden ist, entfernen Sie das / 1000 aus dem Code:
Pazifik
Ost
Zentral
Berg
Hawaii
Arizona
Alaska
quelle
quelle
Ich musste mich auch diesem Problem stellen. Leider war keine der Antworten (hier und auf Dutzenden anderer Seiten) für mich zufriedenstellend, da ich aufgrund von 32-Bit-Ganzzahl-Casts irgendwo immer noch keine Daten über das Jahr 2038 hinaus erreichen kann.
Eine Lösung, die am Ende für mich funktioniert hat, war die Verwendung von
float
Variablen, sodass ich mindestens ein maximales Datum von haben konnte2262-04-11T23:47:16.854775849
. Dies deckt zwar nicht die gesamtedatetime
Domäne ab, ist jedoch für meine Anforderungen ausreichend und kann anderen helfen, die auf dasselbe Problem stoßen.Es sind einige Punkte zu beachten:
@ticksofday
die erste Zeile des Algorithmus entsprechend anpassen .1900-01-01
ist das Ursprungsdatum fürdatetime2
, ebenso wie die Epoche1970-01-01
für Unix-Zeitstempel.float
s hat mir geholfen, das Problem des Jahres 2038 und ganzzahlige Überläufe und dergleichen zu lösen. Beachten Sie jedoch, dass Gleitkommazahlen nicht sehr leistungsfähig sind und die Verarbeitung einer großen Anzahl von Zeitstempeln verlangsamen können. Floats können auch zu Rundungsverlusten aufgrund von Rundungsfehlern führen, wie Sie im Vergleich der Beispielergebnisse für das oben angegebene Maximaldatum sehen können (hier beträgt der Fehler etwa 1,4425 ms).datetime
. Leider gibt es keine explizite Umwandlung von numerischen indatetime2
zulässige Werte , aber es ist zulässig, numerische Wertedatetime
explizit umzuwandeln, und dies wird wiederum implizit in umgewandeltdatetime2
. Dies mag vorerst richtig sein, kann sich jedoch in zukünftigen Versionen von SQL Server ändern: Entweder wird einedateadd_big()
Funktion vorhanden sein oder die explizite Umwandlungdatetime2
wird zugelassen oder die explizite Umwandlungdatetime
wird nicht zugelassen, sodass dies entweder unterbrochen werden kann oder eintreten kann eines Tages ein einfacher Weg.quelle
Für GMT ist hier der einfachste Weg:
quelle
Besser? Diese Funktion konvertiert Unixtime in Millisekunden in Datum / Uhrzeit. Es ist Millisekunden verloren gegangen, aber immer noch sehr nützlich zum Filtern.
quelle
Die Lösung kann folgende sein:
quelle
@DanielLittle hat die einfachste und eleganteste Antwort auf die spezifische Frage. Wenn Sie jedoch an einer Konvertierung in eine bestimmte Zeitzone UND unter Berücksichtigung der Sommerzeit interessiert sind, funktioniert Folgendes gut:
Hinweis: Diese Lösung funktioniert nur unter SQL Server 2016 und höher (und Azure).
So erstellen Sie eine Funktion:
Sie können die Funktion folgendermaßen aufrufen:
quelle