Ich führe einige SQL-Auswahlabfragen durch und möchte meine UTC-Datums- / Uhrzeitspalte in die Ortszeit konvertieren, um sie in meinen Abfrageergebnissen als Ortszeit anzuzeigen. Beachten Sie, dass ich diese Konvertierung NICHT über Code durchführen möchte, sondern wenn ich manuelle und zufällige SQL-Abfragen für meine Datenbanken durchführe.
sql
sql-server
Nugs
quelle
quelle
Antworten:
Sie können dies unter SQL Server 2008 oder höher wie folgt tun:
Sie können auch weniger ausführlich vorgehen:
Was immer Sie tun, nicht verwenden ,
-
um Termine zu subtrahieren, da der Betrieb nicht atomar ist, und Sie werden gelegentlich unbestimmte Ergebnisse erhalten auf Grund der Rasse Bedingungen zwischen dem System Datetime und der lokalen Datetime werden zu unterschiedlichen Zeitpunkten geprüft (dh nicht-atomar) .Bitte beachten Sie, dass diese Antwort die Sommerzeit nicht berücksichtigt. Wenn Sie eine Sommerzeitanpassung vornehmen möchten, lesen Sie bitte auch die folgende SO-Frage:
So erstellen Sie die Start- und Endfunktion für die Sommerzeit in SQL Server
quelle
Ich fand keines dieser Beispiele hilfreich, um eine als UTC gespeicherte Datumszeit auf eine Datumszeit in einer bestimmten Zeitzone zu übertragen (NICHT die Zeitzone des Servers, da Azure SQL-Datenbanken als UTC ausgeführt werden). So habe ich damit umgegangen. Es ist nicht elegant, aber einfach und gibt Ihnen die richtige Antwort, ohne andere Tabellen zu pflegen:
quelle
AT TIME ZONE
Syntax, betrachtet stackoverflow.com/a/44941536/112764 - können Sie Kette mehr Konvertierungen zusammen , indem einfach mehr verkettenat time zone <blah>
s.dateTimeField AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time'
- nur dieAT TIME ZONE
Aussagen zu verketten . (@NateJ erwähnte dies oben, den ich jetzt sehe)Wenn Ihre lokale Datums- und Uhrzeitangabe angegeben ist
Eastern Standard Time
und Sie von UTC in diese konvertieren möchten, können Sie in Azure SQL und SQL Server 2016 und höher Folgendes tun:Die vollständige Liste der Zeitzonennamen finden Sie unter:
Und ja, die Zeitzonen sind schlecht benannt - obwohl dies der
Eastern Standard Time
Fall ist , wird die Sommerzeit berücksichtigt.quelle
Wenn Sie eine andere Konvertierung als den Standort Ihres Servers benötigen, können Sie mit dieser Funktion einen Standardoffset übergeben und die US-Sommerzeit berücksichtigen:
quelle
Verwenden neuer SQL Server 2016-Möglichkeiten:
Aber die clr-Prozedur funktioniert fünfmal schneller: '- (
Beachten Sie, dass sich der Versatz für eine Zeitzone auf Winter- oder Sommerzeit ändern kann. Beispielsweise
Ergebnisse:
Sie können nicht einfach einen konstanten Versatz hinzufügen.
quelle
Wenn das Aktivieren der CLR in Ihrer Datenbank eine Option ist und die Zeitzone des SQL-Servers verwendet wird, kann sie ganz einfach in .Net geschrieben werden.
Ein UTC-Datum / Uhrzeit-Wert wird eingegeben und der lokale Datum / Uhrzeit-Wert relativ zum Server wird ausgegeben. Nullwerte geben null zurück.
quelle
Es gibt keine einfache Möglichkeit, dies korrekt UND allgemein zu tun.
Zunächst muss verstanden werden, dass der Versatz vom fraglichen Datum, der Zeitzone UND der Sommerzeit abhängt.
GetDate()-GetUTCDate
gibt Ihnen heute nur den Offset an der TZ des Servers, der nicht relevant ist.Ich habe nur zwei funktionierende Lösungen gesehen und viel gesucht.
1) Eine benutzerdefinierte SQL-Funktion mit einigen Tabellen mit Basisdaten wie Zeitzonen und DST-Regeln pro TZ. Arbeiten aber nicht sehr elegant. Ich kann es nicht posten, da ich den Code nicht besitze.
BEARBEITEN: Hier ist ein Beispiel für diese Methode https://gist.github.com/drumsta/16b79cee6bc195cd89c8
2) Fügen Sie der Datenbank eine .net-Assembly hinzu. .Net kann dies sehr einfach tun. Dies funktioniert sehr gut, aber der Nachteil ist, dass Sie mehrere Parameter auf Serverebene konfigurieren müssen und die Konfiguration leicht beschädigt werden kann, z. B. wenn Sie die Datenbank wiederherstellen. Ich benutze diese Methode, kann sie aber nicht posten, da mir der Code nicht gehört.
quelle
Keines davon hat bei mir funktioniert, aber das unten hat zu 100% funktioniert. Hoffe, dies kann anderen helfen, die versuchen, es so zu konvertieren, wie ich es war.
quelle
declare @StandardOffset int = datediff (hh, GETUTCDATE(), GETDATE())
Hier ist eine Version, die Sommerzeit und UTC-Offset berücksichtigt und nicht an ein bestimmtes Jahr gebunden ist.
quelle
Ich fand die einmalige Funktion zu langsam, wenn viele Daten vorhanden sind. Also habe ich es getan, indem ich mich einer Tabellenfunktion angeschlossen habe, die eine Berechnung des Stundenunterschieds ermöglicht. Grundsätzlich handelt es sich um Datum / Uhrzeit-Segmente mit dem Stundenversatz. Ein Jahr wäre 4 Reihen. Also die Tabellenfunktion
würde diese Tabelle zurückgeben:
Es berücksichtigt die Sommerzeit. Ein Beispiel für die Verwendung finden Sie weiter unten. Den vollständigen Blog-Beitrag finden Sie hier .
quelle
quelle
Rons Antwort enthält einen Fehler. Es wird 2:00 Uhr Ortszeit verwendet, wenn das UTC-Äquivalent erforderlich ist. Ich habe nicht genügend Reputationspunkte, um Rons Antwort zu kommentieren, daher wird unten eine korrigierte Version angezeigt:
quelle
Der UNIX-Zeitstempel ist lediglich die Anzahl der Sekunden zwischen einem bestimmten Datum und der Unix-Epoche.
SELECT DATEDIFF (SECOND, {d '1970-01-01'}, GETDATE ()) // Dies gibt den UNIX-Zeitstempel in SQL Server zurück
Sie können eine Funktion für die Konvertierung von lokaler Datums- und Uhrzeit in Unix-UTC mithilfe der Länderversatzfunktion in Unix-Zeitstempel in SQL Server erstellen
quelle
Es ist einfach. Versuchen Sie dies für Azure SQL Server:
Für lokalen SQL Server:
quelle
Für
@@Version
Benutzer von Azure SQL und > = SQL Server 2016 finden Sie unten eine einfache FunktionAT TIME ZONE
.Informationen zu möglichen Wertetypen
@LocalTimeZone
finden Sie unter diesem Link oder unterKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
quelle
Als Warnung - wenn Sie Folgendes verwenden möchten (beachten Sie die Millisekunden anstelle von Minuten):
Beachten Sie, dass der DATEDIFF-Teil nicht immer dieselbe Nummer zurückgibt. Verwenden Sie es also nicht, um DateTimes auf Millisekunden zu vergleichen.
quelle
Ich habe festgestellt, dass diese Funktion schneller ist als andere Lösungen, die eine separate Tabelle oder Schleifen verwenden. Es ist nur eine grundlegende Fallaussage. Da alle Monate zwischen April und Oktober einen Versatz von -4 Stunden (Eastern Time) haben, müssen wir nur ein paar weitere Fallzeilen für die Randtage hinzufügen. Andernfalls beträgt der Offset -5 Stunden.
Dies ist spezifisch für eine Konvertierung von UTC zu Eastern Time. Bei Bedarf können jedoch zusätzliche Zeitzonenfunktionen hinzugefügt werden.
quelle
Dies sollte in der Lage sein, Serverzeit mit Sommerzeit zu erhalten
sysdatetimeoffset berücksichtigt die Sommerzeit
quelle
Erste Funktion: konfiguriert für die italienische Zeitzone (+1, +2), Datum wechseln: letzter Sonntag im März und Oktober, Rückgabe der Differenz zwischen der aktuellen Zeitzone und der Datum / Uhrzeit als Parameter.
Der Code lautet:
Dann die Funktion, die das Datum konvertiert
quelle
- Holen Sie sich die indische Standardzeit von utc
quelle
Dies kann ohne Funktion erfolgen. Der folgende Code konvertiert eine UTC-Zeit in die Bergzeit, wobei die Sommerzeit berücksichtigt wird. Passen Sie alle -6- und -7-Zahlen entsprechend an Ihre Zeitzone an (dh für EST würden Sie auf -4 bzw. -5 einstellen).
quelle
Sie müssen den String neu formatieren und zur richtigen Zeit konvertieren. In diesem Fall brauchte ich Zulu-Zeit.
quelle
Bester Weg für Oracle:
Mit fest codierter Datumszeit:
Result:
2018-10-28 00:00
Mit Spalten- und Tabellennamen:
quelle
Ich habe Code, um UTC-zu-Lokal- und Lokal-zu-UTC-Zeiten auszuführen, der die Konvertierung mit Code wie diesem ermöglicht
und
Die Funktionen können alle oder eine Teilmenge von Zeitzonen in der IANA / TZDB unterstützen, wie von NodaTime bereitgestellt - die vollständige Liste finden Sie unter https://nodatime.org/TimeZones
Beachten Sie, dass mein Anwendungsfall bedeutet, dass ich nur ein "aktuelles" Fenster benötige, das die Umrechnung von Zeiten im Bereich von etwa +/- 5 Jahren ermöglicht. Dies bedeutet, dass die von mir verwendete Methode wahrscheinlich nicht für Sie geeignet ist, wenn Sie einen sehr langen Zeitraum benötigen, da Code für jedes Zeitzonenintervall in einem bestimmten Datumsbereich generiert wird.
Das Projekt ist auf GitHub: https://github.com/elliveny/SQLServerTimeConversion
Dadurch wird gemäß diesem Beispiel SQL-Funktionscode generiert
quelle
Wenn Sie die Daten als UTC-Datum in der Datenbank speichern, können Sie so einfach wie möglich vorgehen
Dies war vom Ort des Servers aus immer lokal und Sie fummeln nicht an AT herum
TIME ZONE 'your time zone name'
. Wenn Ihre Datenbank in eine andere Zeitzone wie eine Client-Installation verschoben wird, kann eine fest codierte Zeitzone Sie beißen.quelle
Hier ist eine einfachere, die dst berücksichtigt
quelle
SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), '20150101'), GETDATE())
. Ich bin derzeit in der MESZ (UTC + 2), aber die Sommerzeit wird am Neujahrstag nicht wirksam, sodass die richtige Antwort für mich der 1. Januar 2015 um 01:00 Uhr wäre. Ihre Antwort wird wie die akzeptierte Antwort am 1. Januar 2015 um 02:00 Uhr zurückgegeben.