2013-04-26 13 views
5

Ich möchte feststellen, ob die Sommerzeit aktiv ist oder nicht, aber in einer anderen Region als der, wo sich mein Server befindet.Ermitteln der Sommerzeit auf dem Sql-Server

Mein Problem ist, ich möchte die Sommerzeit von London überprüfen und mein Server ist in Kanada; Ist es möglich, die Sommerzeit einer anderen Zeitzone zu finden?

+1

Duplikat beziehen (keine Antwort): http://stackoverflow.com/questions/6781121/determine-if-daylight-saving-time-is- Aktiv-SQL-Server. Die kurze Antwort ist, dass nichts eingebaut ist. Windows verarbeitet DST mit "Nachschlagetabellen", die in der Registrierung gespeichert sind, auf die normalerweise von T-SQL aus nicht zugegriffen werden kann. – RichardTheKiwi

+0

@RichardTheKiwi - Diese Daten aus der Registrierung ist die Microsoft Time Zone-Datenbank [Siehe hier] (http://stackoverflow.com/tags/timezone/info), und ist über die .NET-Klasse "TimeZoneInfo" zugänglich Wird in SQL Server über SQL CLR-Aufrufe verwendet. Ich werde in Kürze eine Antwort mit einem Codebeispiel posten. –

+0

@RichardTheKiwi - Ich denke, das ist nicht so einfach wie ich dachte. Es ist die richtige Quelle der Daten, aber es gibt einige Probleme. Siehe http: // stackoverflow.com/q/614600/634824 –

Antwort

5

Sie müssen eine Sommerzeittabelle bereitstellen und die Sommerzeit für die gewünschte Region suchen. DST werden von verschiedenen Organisationen veröffentlicht und regelmäßig aktualisiert. Was Sie verstehen müssen, ist, dass die Sommerzeit nicht durch einen Algorithmus bestimmt werden kann, sondern nur so, wie es von verschiedenen gesetzgebenden Körperschaften für verschiedene Regionen festgelegt wird, und häufig geändert wird. Zum Beispiel hier ist die current 2013 DST table. Die aktuelle DST-Look-up-Tabelle Ihrer Anwendung zu verwalten, wäre eine periodische Aufgabe für Ihre Anwendung.

+0

Das Bereitstellen einer Tabelle mit Zeitzonendaten in Ihrer Datenbank ist normalerweise keine gute Idee. Es wird am Ende ein Artefakt sein, das Sie manuell pflegen müssen, und im Laufe der Zeit werden Sie es als ungenau empfinden. –

+3

Ich stehe zu meiner Empfehlung –

+0

@RemusRusanu Wissen Sie, wo wir das DST SQL-Skript für ein bestimmtes Jahr wie 2015 bekommen können? – sqluser

0

Am besten verwenden Sie einen der the two common Time Zone databases.

Es scheint jedoch, dass (nach this question) es schwierig ist, die Microsoft Time-Zone-Datenbank von SQL Server zu verwenden, da die TimeZoneInfo-Klasse mit einem [HostProtection] Attribute mit MayLeakOnAbort gesetzt wahr markiert.

Ich glaube, eine mögliche Lösung wäre NodaTime Klassen stattdessen zu verwenden. Diese sollten von SQL CLR aus zugänglich sein und Zugriff auf beide Datenbanken bieten.

Ich werde dies ausprobieren und hier aktualisieren, wenn Sie fertig sind.

UPDATE

Nachdem sie mit Sicherheitseinschränkungen von SQL CLR kämpfen, habe ich festgestellt, dass dieser Ansatz entweder derzeit nicht möglich ist.

Meine aktuelle Empfehlung wäre Zeitzone Konvertierungen außerhalb der Datenbank, in Ihrer Anwendungslogik.

0

Hier ist eine grobe ISDST für SQL Server ...

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

Renditen 0 für Standardzeit 8. November - 7. MÄRZ und 1 für Daylight Time 8. März - November 7.

+4

Dies könnte (in diesem Jahr?) Für Kanada funktionieren, aber DST beginnt am 29. März 2015 in London. – Paolo

-1

auf dem SQL Server 2016:

Mit sys.time_zone_info können Sie jetzt abfragen, ob eine bestimmte Zeitzone gerade auf DST ist.

select * from sys.time_zone_info 

Hier haben Sie ein Beispielergebnis

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

Ich bin mir nicht sicher, warum das abgelehnt wurde. Das OP hat nicht nach einer Möglichkeit gefragt, DST für eine beliebige Zeit zu kennen - was dies nicht bieten kann. Vielleicht ist die Datenquelle nicht zuverlässig ???? Es wäre schön zu wissen. Auf seinem Gesicht sieht die Lösung lebensfähig aus. – bielawski