2008-10-07 21 views
5

Meine Datenbank-Anwendung wird an mehreren Standorten in verschiedenen Zeitzonen eingesetzt werden.Bestimmen Zeitzone Offset in T-SQL

Ich brauche eine T-SQL-Funktion, die den UTC-Zeitstempel von Mitternacht für YTD Berechnungen 1 des laufenden Jahres Januar bestimmen werden. Alle Daten werden in UTC-Zeitstempeln gespeichert.

Zum Beispiel ist Chicago UTC-6 mit Sommerzeit (DST), die Funktion muss 2008-01-01 06:00:00 zurückgeben, wenn sie 2008 in Chicago ausgeführt wird. Wenn es nächstes Jahr in New York (GMT-5 + DST) läuft, muss es '2009-01-01 05:00:00' zurückgeben.

Ich kann das aktuelle Jahr von Jahr erhalten (GETDATE()). Ich dachte, ich könnte eine DATEDIFF zwischen GETDATE tun() und GETUTCDATE() den Offset zu bestimmen, aber das Ergebnis hängt davon ab, ob die Abfrage während DST ausgeführt wird oder nicht. Ich kenne keine integrierten T-SQL-Funktionen zur Bestimmung des Offsets oder ob die aktuelle Zeit DST ist oder nicht?

Hat jemand eine Lösung für dieses Problem in T-SQL? Ich könnte es hart codieren oder in einer Tabelle speichern, würde es aber lieber nicht tun. Ich nehme an, dass dies eine perfekte Situation für die Verwendung der CLR-Integration in SQL Server 2005 ist. Ich frage mich nur, ob es eine T-SQL-Lösung gibt, die mir nicht bekannt ist?

Antwort

2

prüfen diese vorherige Frage und für verwandte beantworten Informationen:

Effectively Converting dates between UTC and Local (ie. PST) time in SQL 2005

(. um es zusammenzufassen, müssen Sie die Zeitzone und DST Tabellen in SQL Server 2005. in der nächsten Version von SQL Server wir etwas Hilfe mit Zeitzonen bauen)

+0

Danke Eric. Ich habe eine tabellenbasierte Lösung implementiert, wie Sie es in der Vergangenheit vorgeschlagen haben. Ich habe mich nur gefragt, ob es etwas gibt, das ich vermisst habe, das mein Leben leichter machen würde. –

0

Hm, ich glaube, ich bin nicht das Problem zu verstehen. Wenn die Datenbank-App bereits UTC-Zeitstempel für alle Transaktionen speichert - und Sie einige Werte seit dem ersten Jahr der "Ortszeit" zusammenfassen möchten, müsste Ihre Bedingung etwa lauten:

(Zeitstempel + (getUTCDate() - getdate()))> Besetzung ('01/01/2008' als datetime)

die DST auf oder off sein kann je nachdem, wann im Jahr die Abfrage ausgeführt wird - aber getdate() berücksichtigt dies, so dass Sie den Offset jedes Mal dynamisch berechnen müssen.

I ... denken ... :-)

+0

Der Versatz wäre relativ zum aktuellen Datum, nicht zu einem beliebigen zukünftigen Datum. Außerdem wäre es relativ zur Zeitzone des Servers, nicht zum Client. – neonski

0

Wenn ich nicht irre, die GETUTCDATE() gibt die Zeitzone auf dem Server definiert verwendet - es hat keine Informationen über die Zeitzone des Client (oder jede Zeitzone). Ich glaube nicht, dass Informationen irgendwo in SQL Server 2005 gespeichert werden, was es unmöglich macht, diese Informationen zu berechnen.

Vielleicht könnten Sie die Daten aus Oracle's time zone file "ausleihen" und Ihre eigene SQL Server-Funktion erstellen?

Off topic (könnte jemand anderes nützlich sein), aber wenn Sie Oracle verwenden, könnten Sie die FROM_TZ Funktion und ‚AT TIME ZONE‘ verwenden:

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'