Pourquoi AT TIME ZONE n'est-il pas déterministe?

18

SQL Server 2016 ne AT TIME ZONEsemble pas déterministe. Cependant, je n'ai pas été en mesure de trouver de documentation indiquant officiellement cela ou donnant une justification quant au raisonnement derrière cela.

Pourquoi est AT TIME ZONEnon déterministe?

Exemple montrant le non-déterminisme

Exécution:

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

Renvoie l'erreur suivante:

Msg 4936, Level 16, State 1, Line 1
Computed column 'Timestamp' in table 'Test' cannot be persisted because the column is non-deterministic.
Ben Gribaudo
la source
4
Trois mots. Le temps de l'heure d'été.
paparazzo
2
Bienvenue dans le cauchemar connu sous le nom de temps. Je souhaite presque que ce soit obligatoire lorsque vous stockez l'heure, vous avez également enregistré quel fuseau horaire. J'économiserais tellement en médicaments contre les maux de tête.
Eric S
Je viens de créer un élément Microsoft Connect demandant que la documentation soit mise à jour pour refléter le non-déterminisme de «AT TIME ZONE».
Ben Gribaudo

Réponses:

20

AT TIME ZONE emploie une certaine logique pour calculer l'heure d'été. Les valeurs de décalage DST ne sont pas immuables (elles sont sujettes à modification via les mises à jour Windows ) et sont contenues en externe dans le registre Windows, donc la AT TIME ZONEfonction ne peut pas être déterministe car elle s'appuie sur des données externes.

De même, c'est pourquoi sys.time_zone_info s'agit d'une vue et non d'une table de référence statique, elle doit être calculée en fonction des valeurs de registre qui disposent des informations de fuseau horaire les plus à jour.

LowlyDBA
la source
1
Mais ne devrait-il pas être calculé en fonction de la date de conversion? Si ce n'est pas déterministe, c'est parce que la règle du début de l'heure d'été peut changer à l'avenir, comme en 2009.
Random832
@ Random832 Droite! J'ai ignoré certains détails pour cela, j'ai mis à jour pour être plus clair.
LowlyDBA
2
@ Random832, tenez compte non seulement des dates passées mais des dates futures. Si une date future est stockée sur la base des règles de changement d'heure qui existent aujourd'hui, la valeur deviendra invalide si les règles changent d'ici là,
Dan Guzman
1
John: ce sont de bonnes informations, mais ne serait-il pas plus précis sur le plan technique de les réorganiser un peu pour dire que la véritable raison pour laquelle elles ne sont pas déterministes est simplement due à la dépendance externe à l'obtention des informations du registre? Bien sûr, pourquoi il doit obtenir les informations à partir de là plutôt que d'être codé en dur dans le code de l'application (c'est-à-dire la cause racine) est principalement dû à la fréquence à laquelle les règles DST changent et au fait que de nouveaux fuseaux horaires peuvent être introduits, mais c'est vraiment secondaire, non? Mais quel que soit le «pourquoi», toute dépendance externe devrait rendre toute fonction non déterministe.
Solomon Rutzky
1
Impressionnant! Pour info, j'ai trouvé ici des informations plutôt intéressantes - en.wikipedia.org/wiki/Tz_database - qui semblent être l'un des rares documents (du moins que j'ai pu trouver jusqu'à présent) qui indiquent que l'heure d'été n'est pas la seule chose changer. D'après ce que je peux dire en regardant le fichier C: \ Windows \ Globalization \ Time Zone \ timezones.xml , même les décalages de base peuvent changer au fil du temps, mais moins fréquemment depuis 1970, je suppose. +1 :-) (a dû republier cela car le lien avait un mauvais caractère)
Solomon Rutzky
1

J'ai ajouté AT TIME ZONE à la liste non déterministe de la rubrique déterministe et non déterministe, et dans la rubrique AT TIME ZONE, j'ai ajouté: étant donné que certaines informations (telles que les règles de fuseau horaire) sont conservées en dehors de SQL Server et sont sujettes à des modifications occasionnelles, la fonction AT TIME ZONE est classée comme non déterministe. Merci de le mentionner. Rick Byham, documentation en ligne de SQL Server.

Rick Byham n'implique aucune garantie
la source
2
Cela devrait être un commentaire plutôt qu'une réponse!
Kin Shah