2013-04-26 8 views
5

Desidero determinare se l'ora legale è attiva o meno, ma in una regione diversa da quella in cui si trova il mio server.Determinazione dell'ora legale remota in SQL Server

Il mio problema è che voglio controllare l'ora legale di Londra e il mio server è in Canada; è possibile trovare l'ora legale di un fuso orario diverso?

+1

riferiscono duplicato (nessuna risposta): http://stackoverflow.com/questions/6781121/determine-if-daylight-saving-time-is- active-sql-server. La risposta breve è che non c'è nulla di integrato. Windows elabora l'ora legale utilizzando "tabelle di ricerca" memorizzate nel registro che non sono normalmente accessibili da T-SQL. – RichardTheKiwi

+0

@RichardTheKiwi - Questo dato dal registro è il database del fuso orario Microsoft [Vedi qui] (http://stackoverflow.com/tags/timezone/info) ed è accessibile tramite la classe .Net 'TimeZoneInfo', che può essere utilizzato in SQL Server tramite le chiamate CLR SQL. Pubblicherò una risposta a breve con un esempio di codice. –

+0

@RichardTheKiwi - Immagino che non sia così facile come pensavo. È la fonte corretta dei dati, ma ci sono alcuni problemi. Vedi http: // StackOverflow.com/q/614600/634824 –

risposta

5

è necessario distribuire un tavolo di DST e cercare il tempo di ora legale per la regione che si desidera. L'ora legale è pubblicata da varie organizzazioni e aggiornata periodicamente. Quello che devi capire è che l'ora legale non può essere determinata da un algoritmo, può solo essere osservata come è impostata da vari organismi legislativi per varie regioni e cambia frequentemente. Ad esempio, ecco lo current 2013 DST table. Mantenere aggiornata la tabella di ricerca DST dell'applicazione corrente sarebbe un'attività periodica per l'applicazione.

+0

La distribuzione di una tabella di dati relativi al fuso orario nel database di solito non è una buona idea. Finirà per essere un artefatto che devi mantenere manualmente, e nel tempo lo troverai impreciso. –

+3

Seguo la mia raccomandazione –

+0

@RemusRusanu Sai dove possiamo ottenere lo script DST SQL per un anno specifico come il 2015? – sqluser

0

La cosa migliore da fare sarebbe utilizzare uno di the two common Time Zone databases.

Tuttavia, sembra che (secondo this question) è difficile da utilizzare il database di Microsoft TimeZone da SQL Server perché la classe TimeZoneInfo è contrassegnato con un attributo [HostProtection] con MayLeakOnAbort set vero.

Credo che una soluzione possibile sarebbe utilizzare invece le classi NodaTime. Questi dovrebbero essere accessibili da SQL CLR e fornire l'accesso a entrambi i database.

Ci proverò e aggiornerò qui quando completo.

UPDATE

Dopo aver combattuto con restrizioni di sicurezza di SQL CLR, ho concluso che questo è l'approccio non è attualmente possibile sia.

mia raccomandazione attuale sarebbe quello di fare conversioni di fuso orario al di fuori del database, nella vostra logica dell'applicazione.

0

Ecco un isdst greggio per SQL Server ...

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

rendimenti 0 per standard Tempo novembre 8-07 marzo, e 1 per Daylight Time 8 marzo - novembre 7.

+4

Questo potrebbe funzionare (quest'anno?) Per il Canada, ma l'ora legale inizia il 29 marzo 2015 a Londra. – Paolo

-1

su SQL Server 2016:

Con sys.time_zone_info ora è possibile eseguire una query se un fuso orario specifico è attualmente in DST.

select * from sys.time_zone_info 

Qui si ha un risultato esempio

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

Non sono sicuro del motivo per cui questo è stato down-votato. L'OP non ha chiesto un modo per conoscere l'ora legale per un tempo arbitrario - cosa che non può fornire. Forse la fonte dei dati non è affidabile ???? Sarebbe bello saperlo. Sul suo volto la soluzione sembra vitale. – bielawski