2017-09-05 8 views
1

Wir haben Daten in SQL Server 2008 mit mehreren Datumsspalten. Da das Datumsformat in SQL Server ein großer ganzzahliger Wert ist, d. H. Die Anzahl der Sekunden seit 1970, verwenden wir die Funktion DATEADD(), um sie in das tatsächliche Datumsformat zu konvertieren. Aber das Problem, mit dem wir konfrontiert sind, ist, dass wir, wenn wir DATEADD() verwenden, Daten in der UTC-Zeitzone erhalten, während wir Daten in EST wollen. Ich habe versucht, einfach -4 HR von der Zeit zu verwenden, aber während NOV - MAR sind wir 1 HR voraus, weil der Unterschied 5 HR ist, wenn die Sommerzeit aus ist. Gibt es eine Funktion, die Sommerzeit berücksichtigt? Jede Hilfe wird geschätzt.UTC zu EST SQL Server 2008

Current Function -> DATEADD(s, columnName, '01/01/1970 00:00:00') 

Grüße, Sahil

+4

Es gibt nichts natives. Das ist unglaublich schwierig. Die Daten für die Sommerzeit haben sich im Laufe der Jahre geändert. Einige Staaten erkennen keine Sommerzeit. Nicht einmal der gesamte Bundesstaat Arizona erkennt die Sommerzeit. Und das ist nur die Komplikation in den USA. Sobald Sie diese Grenzen verlassen, wird es noch komplizierter. –

+0

Es gibt ganze Bibliotheken, die strikt geschrieben sind, um mit Dates/Times umzugehen (* wie NodaTime, Momentjs, etc *), aber nicht für Sql Server, die ich kenne, da dies in der Anwendungsschicht und nicht der Persistenzschicht angesprochen wird. – Igor

+0

Sie können eine Assembly importieren, die die TimeZoneInfo-Klasse umschließt und aus den Windows-Registrierungswerten für Zeitzonen-Offsets liest (genau so, wie Windows es tut). Diese Werte werden sporadisch aktualisiert, wenn Sie Windows-Updates anwenden. Zeitzoneninformationen ändern sich nicht nur auf einer geplanten (DST oder was auch immer) Basis, sondern ändern sich auch auf einer Ad-hoc-Basis, wie es Regionen und Länder für richtig halten. Ich würde eine getestete Bibliothek verwenden und diese in SQL-Server importieren. –

Antwort

0

try this:

DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), columnName) 
+1

Dies funktioniert nur, wenn wir möchten, dass die Zeitkonvertierung in der aktuellen Zeit erfolgt - d. H. Wenn es momentan Sommerzeit ist oder nicht. Ich glaube, das OP hat Datumswerte um das Jahr und muss basierend auf dem Datum des Feldes von UTC zu EST konvertieren. – erict

-1

ich ein UDF schreiben würde, die von worldtimeserver.com mit einer Zeit Datenbank wie die interagiert - ich bin nicht angeschlossen mit ihnen und haben es mit einer schnellen Internetsuche gefunden.

Weitere Untersuchungen zeigen, dass timezonedb.com eine kostenlose (wenn nicht kommerzielle) Mitgliedschaft hat, die Datenbank herunterladen kann und Beispiele für die Verwendung mit SQL Server und MySQL enthält.

0

Sie können mein SQL Server Time Zone Support Projekt dafür verwenden. Es verwendet IANA-Standardzeitzonennamen, as listed here.

Aufbauend auf Ihrem Beispiel die folgenden ersten Bekehrten von einem UNIX-Timestamp zu einem UTC laufen datetime wandeln dann zu einem datetime in der US Eastern Time-Zone.

SELECT Tzdb.UtcToLocal(DATEADD(s, columnName, '1970-01-01 00:00:00'), 'America/New_York')