Dlaczego AT TIME ZONE jest niedeterministyczny?

18

SQL Server 2016 AT TIME ZONEwydaje się niedeterministyczny. Jednak nie byłem w stanie znaleźć dokumentacji oficjalnie stwierdzającej to ani uzasadniającej jej uzasadnienie.

Dlaczego jest AT TIME ZONEniedeterministyczny?

Przykład pokazujący brak determinizmu

Wykonywanie:

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

Zwraca następujący błąd:

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
źródło
4
Trzy słowa. Czasu letniego.
paparazzo
2
Witamy w koszmarze znanym jako czas. Niemal żałuję, że nie jest to obowiązkowe, kiedy przechowujesz czas, a także zapisujesz strefę czasową. Zaoszczędziłbym tyle na lekach na ból głowy.
Eric S
Właśnie utworzyłem element Microsoft Connect z prośbą o aktualizację dokumentacji, aby odzwierciedlić niedeterminizm AT TIME ZONE.
Ben Gribaudo

Odpowiedzi:

20

AT TIME ZONE stosuje pewną logikę do obliczania czasu letniego. Wartości przesunięcia DST nie są niezmienne (mogą ulec zmianie poprzez aktualizacje systemu Windows ) i są zawarte zewnętrznie w rejestrze systemu Windows, dlatego też AT TIME ZONEfunkcja nie może być deterministyczna, ponieważ opiera się na danych zewnętrznych.

Podobnie, dlatego sys.time_zone_infojest widokiem, a nie statyczną tabelą odniesienia, należy go obliczyć w zależności od wartości rejestru, które zawierają najbardziej aktualne informacje o strefie czasowej.

LowlyDBA
źródło
1
Ale czy nie należy tego obliczać w odniesieniu do konwertowanej daty? Jeśli nie jest deterministyczne, to dlatego, że reguła, od której zaczyna się dzień, może się zmienić w przyszłości, podobnie jak w 2009 roku.
Random832
@ Random832 Racja! Pominąłem niektóre szczegóły, zaktualizowałem, aby było bardziej jasne.
LowlyDBA,
2
@ Random832, rozważ nie tylko przeszłe daty, ale przyszłe daty. Jeśli przyszła data będzie przechowywana w oparciu o istniejące dziś reguły zmiany czasu, wartość stanie się nieważna, jeśli reguły zmienią się od czasu do czasu,
Dan Guzman
1
John: to dobra informacja, ale czy nie byłoby technicznie bardziej dokładne przestawienie tego trochę, żeby powiedzieć, że faktyczny powód, dla którego nie jest deterministyczny, wynika jedynie z zewnętrznej zależności od pobierania informacji z rejestru? Jasne, dlaczego musi uzyskać stamtąd informacje, a nie zostać zakodowane na stałe w kodzie aplikacji (tj. Przyczynę źródłową), głównie z powodu częstotliwości zmian reguł DST oraz faktu, że można wprowadzić nowe strefy czasowe, ale to naprawdę drugorzędne, prawda? Ale niezależnie od „dlaczego”, każda zależność zewnętrzna powinna sprawić, że każda funkcja nie będzie deterministyczna.
Solomon Rutzky
1
Niesamowite! Do Twojej wiadomości, znalazłem tutaj dość interesujące informacje - en.wikipedia.org/wiki/Tz_database - które wydają się być jednym z niewielu dokumentów (przynajmniej, które do tej pory mogłem znaleźć), które wskazują, że DST nie jest jedyną rzeczą zmienić. Z tego, co mogę powiedzieć po zapoznaniu się z plikiem C: \ Windows \ Globalizacja \ Strefa czasowa \ timezones.xml , nawet podstawowe przesunięcia mogą się zmieniać w czasie, choć chyba rzadziej od 1970 roku. +1 :-) (musiałem to ponownie opublikować, ponieważ link miał zły charakter)
Solomon Rutzky
1

Dodałem AT TIME ZONE do listy niedeterministycznej w temacie Deterministycznym i niedeterministycznym, aw temacie AT TIME ZONE dodałem: Ponieważ niektóre informacje (takie jak reguły strefy czasowej) są przechowywane poza SQL Server i mogą podlegać sporadycznym zmianom, funkcja AT TIME ZONE jest klasyfikowana jako niedeterministyczna. Dziękuję za poruszenie tego tematu. Rick Byham, SQL Server Books Online.

Rick Byham nie sugeruje żadnej gwarancji
źródło
2
To powinien być komentarz, a nie odpowiedź!
Kin Shah,