2013-04-26 11 views
5

Chcę określić, czy czas letni jest aktywny, czy nie, ale w regionie innym niż mój serwer.Określanie zdalnej zmiany czasu letniego w serwerze sql

Mój problem polega na tym, że chcę sprawdzić oszczędność czasu letniego w Londynie, a mój serwer znajduje się w Kanadzie; czy możliwe jest znalezienie czasu letniego w innej strefie czasowej?

+1

odnoszą duplikat (brak odpowiedzi): http://stackoverflow.com/questions/6781121/determine-if-daylight-saving-time-is- active-sql-server. Krótka odpowiedź brzmi, że nic nie jest wbudowane. Windows przetwarza DST za pomocą "tabel wyszukiwania" przechowywanych w rejestrze, które zwykle nie są dostępne z poziomu T-SQL. – RichardTheKiwi

+0

@RichardTheKiwi - dane z rejestru to baza danych Microsoft Time Zone [patrz tutaj] (http://stackoverflow.com/tags/timezone/info) i jest dostępna przez klasę .Net 'TimeZoneInfo', która może być używany w SQL Server za pośrednictwem wywołań SQL CLR. Wkrótce opublikuję odpowiedź z próbką kodu. –

+0

@RichardTheKiwi - Myślę, że to nie jest tak proste, jak myślałem. Jest to poprawne źródło danych, ale są pewne problemy. Zobacz http: // stackoverflow.com/q/614600/634824 –

Odpowiedz

5

Należy wdrożyć tabelę czasu letniego i sprawdzić czas DST dla wybranego regionu. DST są publikowane przez różne organizacje i okresowo aktualizowane. Trzeba zrozumieć, że DST nie może być ustalony przez algorytm, można go tylko sprawdzić, jak określają różne organy ustawodawcze w różnych regionach i często się zmienia. Na przykład tutaj jest current 2013 DST table. Utrzymanie aktualnego bieżącego wyniku tabeli DST aplikacji będzie okresowym zadaniem aplikacji.

+0

Wdrażanie tabeli danych strefy czasowej w bazie danych zazwyczaj nie jest dobrym pomysłem. Będzie to artefakt, który trzeba będzie utrzymywać ręcznie, a z czasem okaże się on niedokładny. –

+3

Podtrzymuję moją rekomendację –

+0

@RemusRusanu Czy wiesz, gdzie możemy uzyskać skrypt SQL DST na konkretny rok, np. 2015? – sqluser

0

Najlepszą rzeczą do zrobienia byłoby użycie jednego z the two common Time Zone databases.

Okazuje się jednak, że (według this question) trudno jest korzystać z bazy danych Microsoft SQL Server z TimeZone ponieważ klasa TimeZoneInfo jest oznaczony atrybutem [HostProtection] z MayLeakOnAbort ustawiony prawda.

Uważam, że możliwym rozwiązaniem byłoby użycie klas NodaTime. Powinny one być dostępne z SQL CLR i zapewniać dostęp do baz danych , zarówno.

Wypróbuję to i zaktualizuję tutaj po zakończeniu.

UPDATE

Po walce z ograniczeniami bezpieczeństwa SQL CLR, mam do wniosku, że to podejście nie jest aktualnie możliwe albo.

Moje bieżące zalecenie byłoby robić konwersje strefy czasowej poza bazą danych, w logice aplikacji.

0

Oto surowy IsDST dla SQL Server ...

CAST((DATEPART(month, DATEADD(week, -1, <DateTime>)) + 2) % 13/5 AS bit) AS IsDST

Plony 0 dla standardowego czasu lis 8 - Mar 7 i 1 dla Daylight Time 08 marca - Nov 7.

+4

To może zadziałać (w tym roku?) Dla Kanady, ale DST rozpoczyna się 29 marca 2015 r. W Londynie. – Paolo

-1

na SQL Server 2016:

Z sys.time_zone_info teraz możesz zapytać, czy konkretna strefa czasowa jest aktualnie w DST.

select * from sys.time_zone_info 

Tutaj masz Przykładowy wynik

name     current_utc_offset is_currently_dst 
Aleutian Standard Time -09:00    1 
Hawaiian Standard Time -10:00    0 
Marquesas Standard Time -09:30    0 
Alaskan Standard Time -08:00    1 
+1

Nie jestem pewien, dlaczego to nie było głosowanie. PO nie pytał o sposób na zapoznanie się z DST przez arbitralny czas - czego nie może to zapewnić. Być może źródło danych nie jest wiarygodne ???? Byłoby miło wiedzieć. Na pierwszy rzut oka rozwiązanie wygląda realistycznie. – bielawski

Powiązane problemy