Ich verwende derzeit Folgendes, um eine lokale Datumszeit von einer UTC-Datumszeit zu erhalten:
SET @offset = DateDiff(minute, GetUTCDate(), GetDate())
SET @localDateTime = DateAdd(minute, @offset, @utcDateTime)
Mein Problem ist, dass, wenn Sommerzeit zwischen GetUTCDate()
und auftritt @utcDateTime
, die@localDateTime
Ende eine Stunde frei ist.
Gibt es eine einfache Möglichkeit, ein Datum, das nicht das aktuelle Datum ist, von UTC auf Ortszeit umzurechnen?
Ich verwende SQL Server 2005
WITH PERMISSION_SET = UNSAFE
. In einigen Umgebungen ist dies wie in AWS RDS nicht möglich. Und es ist unsicher. Leider gibt es keine vollständige Implementierung der .Net-Zeitzone, die ohneunsafe
Erlaubnis verwendet werden kann. Sehen Sie hier und hier .Ich habe die T-SQL Toolbox entwickelt und veröffentlicht Projekt für Codeplex , um allen zu helfen, die mit der Verarbeitung von Datum und Uhrzeit in Microsoft SQL Server zu kämpfen haben. Es ist Open Source und völlig kostenlos zu benutzen.
Es bietet einfache UDFs für die Datums- und Uhrzeitkonvertierung mit einfachem T-SQL (keine CLRs) sowie vorgefüllte Konfigurationstabellen. Und es hat volle Sommerzeitunterstützung.
Eine Liste aller unterstützten Zeitzonen finden Sie in der Tabelle "DateTimeUtil.Timezone" (in der T-SQL Toolbox-Datenbank enthalten).
In Ihrem Beispiel können Sie das folgende Beispiel verwenden:
Dadurch wird der konvertierte lokale Datums- / Uhrzeitwert zurückgegeben.
Leider wird es für SQL Server 2008 oder höher nur aufgrund neuerer Datentypen (DATE, TIME, DATETIME2) unterstützt. Da der vollständige Quellcode bereitgestellt wird, können Sie die Tabellen und UDFs problemlos anpassen, indem Sie sie durch DATETIME ersetzen. Ich habe kein MSSQL 2005 zum Testen zur Verfügung, aber es sollte dann auch mit MSSQL 2005 funktionieren. Bei Fragen lass es mich einfach wissen.
quelle
Ich benutze immer diesen TSQL-Befehl.
Es ist sehr einfach und es macht den Job.
quelle
Ich habe diese Antwort gefunden auf StackOverflow gefunden, das eine benutzerdefinierte Funktion bereitstellt, die die Datumsangaben genau zu übersetzen scheint
Das einzige, was Sie ändern müssen, ist die
@offset
Variable oben, um sie auf den Zeitzonenoffset des SQL-Servers festzulegen, auf dem diese Funktion ausgeführt wird. In meinem Fall verwendet unser SQL-Server EST (GMT-5)Es ist nicht perfekt und wird wahrscheinlich in vielen Fällen nicht funktionieren, wenn TZ-Offsets für eine halbe Stunde oder 15 Minuten vorliegen (für diejenigen, für die ich eine CLR-Funktion wie die von Kevin empfohlene empfehlen würde ), aber es funktioniert gut genug für die meisten allgemeinen Zeitzonen im Norden Amerika.
quelle
Für SQL Server 2016+ können Sie AT TIME ZONE verwenden . Es behandelt automatisch die Sommerzeit.
quelle
Auf eine ähnliche Frage , die bei Stack Overflow gestellt wird, gibt es einige gute Antworten . Abschließend habe ich einen T-SQL-Ansatz aus der zweiten Antwort von Bob Albright verwendet , um ein Durcheinander zu beseitigen, das von einem Datenkonvertierungsberater verursacht wurde.
Es funktionierte für fast alle unsere Daten, aber später wurde mir klar, dass sein Algorithmus nur für Datumsangaben bis zum 5. April 1987 funktioniert , und wir hatten einige Datumsangaben aus den 1940er Jahren, die immer noch nicht richtig konvertiert wurden. Letztendlich mussten die
UTC
Daten in unserer SQL Server-Datenbank mit einem Algorithmus in einem Programm eines Drittanbieters übereinstimmen, das die Java-API für die Konvertierung vonUTC
in die Ortszeit verwendete.Ich mag das obige
CLR
Beispiel in Kevin Feasels Antwort unter Verwendung von Harsh Chawlas Beispiel und ich möchte es auch mit einer Lösung vergleichen, die Java verwendet, da unser Front-End Java verwendet, um dieUTC
Konvertierung in die lokale Zeit durchzuführen.Wikipedia erwähnt 8 verschiedene Verfassungsänderungen, die Zeitzonenanpassungen vor 1987 beinhalten, und viele davon sind stark auf verschiedene Bundesstaaten beschränkt, so dass die CLR und Java sie möglicherweise unterschiedlich interpretieren. Verwendet Ihr Front-End-Anwendungscode Dotnet oder Java oder sind Daten vor 1987 ein Problem für Sie?
quelle
Sie können dies problemlos mit einer gespeicherten CLR-Prozedur tun.
Sie können die verfügbaren Zeitzonen in einer Tabelle speichern:
Und diese gespeicherte Prozedur füllt die Tabelle mit den möglichen Zeitzonen auf Ihrem Server.
quelle
WITH PERMISSION_SET = UNSAFE
. In einigen Umgebungen ist dies wie in AWS RDS nicht möglich. Und es ist unsicher. Leider gibt es keine vollständige Implementierung der .Net-Zeitzone, die ohneunsafe
Erlaubnis verwendet werden kann. Sehen Sie hier und hier .Die SQL Server-Version 2016 wird dieses Problem ein für alle Mal lösen . Für frühere Versionen ist eine CLR-Lösung wahrscheinlich am einfachsten. Oder für eine bestimmte DST-Regel (wie nur für USA) kann eine T-SQL-Funktion relativ einfach sein.
Ich denke jedoch, dass eine generische T-SQL-Lösung möglich sein könnte.
xp_regread
Versuchen Sie Folgendes, solange es funktioniert:Eine (komplexe) T-SQL-Funktion könnte diese Daten verwenden , um den genauen Versatz für alle Daten während der aktuellen DST-Regel zu bestimmen.
quelle
quelle
Hier ist eine Antwort, die für eine bestimmte britische Anwendung geschrieben wurde und ausschließlich auf SELECT basiert.
Bei Beginn der Sommerzeit zwischen Mitternacht und 1 Uhr morgens nicht anwendbar. Dies könnte korrigiert werden, aber die Anwendung, für die es geschrieben wurde, erfordert es nicht.
quelle