Perché AT TIME ZONE non è deterministico?


18

SQL Server 2016 AT TIME ZONEsembra non deterministico. Tuttavia, non sono stato in grado di trovare documentazione che affermi ufficialmente questo o fornisca una motivazione sul ragionamento alla base.

Perché AT TIME ZONEnon deterministico?

Esempio che mostra non determinismo

Esecuzione:

CREATE TABLE Test (
    LegacyTimestamp DATETIME,
    Timestamp AS LegacyTimestamp AT TIME ZONE 'Eastern Standard Time' PERSISTED
); 

Restituisce il seguente errore:

Msg 4936, Level 16, State 1, Line 1
Computed column 'Timestamp' in table 'Test' cannot be persisted because the column is non-deterministic.

4
Tre parole. Ora legale.
paparazzo,

2
Benvenuti nell'incubo noto come il tempo. Vorrei quasi che fosse obbligatorio quando memorizzi l'ora, hai anche memorizzato quale fuso orario. Vorrei risparmiare così tanto nella cura del mal di testa.
Eric S,

Ho appena creato un elemento di Microsoft Connect che richiede l'aggiornamento della documentazione per riflettere il non determinismo di "AT TIME ZONE".
Ben Gribaudo,

Risposte:


20

AT TIME ZONE utilizza una logica per calcolare l'ora legale. I valori di offset dell'ora legale non sono immutabili (sono soggetti a modifiche tramite gli aggiornamenti di Windows ) e sono contenuti esternamente nel registro di Windows, quindi la AT TIME ZONEfunzione non può essere deterministica poiché si basa su dati esterni.

Allo stesso modo, questo è il motivo per cui sys.time_zone_infoè una vista e non una tabella di riferimento statica, deve essere calcolata in base ai valori di registro che contengono le informazioni sul fuso orario più aggiornate.


1
Ma non dovrebbe essere calcolato in riferimento alla data di conversione? Se non è deterministico, è perché la regola
dell'inizio

@ Random832 Giusto! Ho ignorato alcuni dettagli per questo, ho aggiornato per essere più chiaro.
LowlyDBA,

2
@ Random832, considera non solo le date passate ma anche quelle future. Se una data futura viene memorizzata in base alle regole di modifica dell'ora che esistono oggi, il valore diventerà non valido se le regole cambiano tra oggi e allora,
Dan Guzman

1
John: queste sono buone informazioni, ma non sarebbe più tecnicamente accurato riorganizzarle un po 'per dire che la vera ragione per cui non è deterministica è semplicemente dovuta alla dipendenza esterna dall'ottenere le informazioni dal registro? Certo, il motivo per cui deve ottenere le informazioni da lì anziché essere codificato nel codice dell'app (ovvero la causa principale) è principalmente dovuto alla frequenza con cui cambiano le regole dell'ora legale e al fatto che possono essere introdotti nuovi fusi orari, ma questo è davvero secondario, giusto? Ma indipendentemente dal "perché", qualsiasi dipendenza esterna dovrebbe rendere qualsiasi funzione non deterministica.
Solomon Rutzky,

1
Eccezionale! Cordiali saluti, ho trovato alcune informazioni piuttosto interessanti qui - en.wikipedia.org/wiki/Tz_database - che sembra essere uno dei pochi documenti (almeno che ho potuto trovare finora) che indicano che l'ora legale non è l'unica cosa cambiare. Da quello che posso dire guardando il file C: \ Windows \ Globalization \ Time Zone \ timezones.xml , anche gli offset di base possono cambiare nel tempo, anche se meno frequentemente dal 1970, immagino. +1 :-) (ho dovuto ripubblicare poiché il collegamento aveva un brutto personaggio)
Solomon Rutzky,

1

Ho aggiunto AT TIME ZONE all'elenco non deterministico sull'argomento deterministico e non deterministico e nell'argomento AT TIME ZONE, ho aggiunto: poiché alcune informazioni (come le regole del fuso orario) vengono mantenute al di fuori di SQL Server e sono soggette a modifiche occasionali, la funzione AT TIME ZONE è classificata come non deterministica. Ti ringrazio per aver sollevato la questione. Rick Byham, documentazione online di SQL Server.


2
Questo dovrebbe essere un commento piuttosto che una risposta!
Kin Shah,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.