2008-10-07 23 views
5

Moja aplikacja bazy danych zostanie wdrożona w wielu witrynach w różnych strefach czasowych.Określanie przesunięcia strefy czasowej w T-SQL

Potrzebuję funkcji T-SQL, która określi znacznik UTC o północy 1 stycznia bieżącego roku dla obliczeń YTD. Wszystkie dane są przechowywane w datownikach UTC.

Na przykład, Chicago jest UTC-6 z Daylight Savings Time (DST), funkcja musi wrócić "2008-01-01 06:00:00", jeśli zostanie uruchomiona w dowolnym czasie w 2008 roku w Chicago. Jeśli zostanie uruchomiony w Nowym Jorku (GMT-5 + DST) w przyszłym roku, musi wrócić "2009-01-01 05:00:00".

Mogę uzyskać bieżący rok z ROKU (GETDATE()). Myślałem, że mogę zrobić DATEDIFF między GETDATE() i GETUTCDATE(), aby określić offset, ale wynik zależy od tego, czy zapytanie jest uruchamiane podczas DST, czy nie. Nie znam żadnych wbudowanych funkcji T-SQL do określania przesunięcia lub czy aktualny czas jest czasem letnim, czy nie?

Czy ktoś ma rozwiązanie tego problemu w T-SQL? Mogę to zakodować na twardym dysku lub zapisać w tabeli, ale wolałbym tego nie robić. Przypuszczam, że jest to idealna sytuacja do korzystania z integracji CLR w SQL Server 2005. Zastanawiam się tylko, czy istnieje rozwiązanie T-SQL, którego nie jestem świadomy?

Odpowiedz

2

Sprawdź ten poprzednie pytanie i odpowiedzieć na związane informacje:

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

(. Podsumowując, trzeba zrobić, aby zbudować strefę czasową i DST tabel w SQL Server 2005. W następnej wersji SQL Server możemy uzyskać pomoc ze stref czasowych)

+0

Dzięki Eric. Zaimplementowałem rozwiązanie oparte na tabelach, które zasugerowałeś w przeszłości. Zastanawiałem się tylko, czy coś, co przeoczyłem, ułatwiłoby mi życie. –

0

Hm, myślę, że nie rozumiem problemu. Jeśli aplikacja bazodanowa zapisuje już sygnatury czasowe UTC dla wszystkich jej transakcji - i chcesz podsumować niektóre wartości od pierwszego dnia "czasu lokalnego", Twój stan musi być podobny do:

(znacznik czasu + (getUTCDate() - getdate()))> obsada ('01/01/2008' jako datetime)

DST może być na lub off w zależności od kiedy w roku prowadzona jest kwerenda - ale getdate() bierze to pod uwagę, więc za każdym razem musisz dynamicznie obliczać offset.

... Ja myślę ... :-)

+0

Przesunięcie będzie miało związek z bieżącą datą, a nie z datą szczegółową w przyszłości. Ponadto byłby on względny względem strefy czasowej serwera, a nie klienta. – neonski

0

O ile się nie mylę, getUTCDate() Funkcja ta wykorzystuje strefę czasową określoną na serwerze - nie ma informacji na temat strefy czasowej klienta (lub w dowolnej strefie czasowej). Nie sądzę, że informacje są przechowywane w dowolnym miejscu w SQL Server 2005, co uniemożliwia obliczenie tych informacji.

Może mógłbyś "pożyczyć" dane od Oracle's time zone file i zbudować własną funkcję serwera SQL?

Off topic (mogą być przydatne dla kogoś innego), ale jeśli były przy użyciu Oracle, można użyć funkcji FROM_TZ i „AT TIME ZONE”:

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek' 
Powiązane problemy