Почему ВРЕМЕННАЯ ЗОНА недетерминирована?

18

SQL Server 2016 AT TIME ZONEкажется недетерминированным. Тем не менее, я не смог найти документацию, официально заявляющую об этом или обосновывающую причину этого.

Почему AT TIME ZONEнедетерминированный?

Пример, показывающий недетерминизм

Выполнение:

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

Возвращает следующую ошибку:

Msg 4936, Level 16, State 1, Line 1
Computed column 'Timestamp' in table 'Test' cannot be persisted because the column is non-deterministic.
Бен Грибаудо
источник
4
Три слова. Летнее время.
Папараццо
2
Добро пожаловать в кошмар, известный как время. Я почти хотел бы, чтобы это было обязательно, когда вы сохраняете время, вы также сохраняли, какой часовой пояс также. Я бы сэкономил так много лекарств от головной боли.
Эрик С.
Только что создал элемент Microsoft Connect с просьбой обновить документацию, чтобы отразить недетерминированность «ВРЕМЕННОЙ ЗОНЫ».
Бен Грибаудо

Ответы:

20

AT TIME ZONE использует некоторую логику для расчета перехода на летнее время. Значения смещения DST не являются неизменяемыми (они могут изменяться через обновления Windows ) и содержатся внешне в реестре Windows, поэтому AT TIME ZONEфункция не может быть детерминированной, так как она полагается на внешние данные.

Аналогичным образом, именно поэтому sys.time_zone_infoэто представление, а не статическая справочная таблица, его необходимо рассчитывать в зависимости от значений реестра, которые содержат самую актуальную информацию о часовом поясе.

LowlyDBA
источник
1
Но это не должно быть рассчитано со ссылкой на дату конвертации? Если это недетерминировано, то это потому, что правило, с которого начинается летнее время, может измениться в будущем, как это произошло в 2009 году.
Random832
@ Random832 Точно! Я пропустил некоторые детали для этого, я обновил, чтобы быть более понятным.
LowlyDBA
2
@ Random832, рассмотрим не только прошлые, но и будущие даты. Если будущая дата будет сохранена на основе существующих сегодня правил изменения времени, значение станет недействительным, если правила изменяются между
Дэн Гузман,
1
Джон: это хорошая информация, но не будет ли технически более точным изменить это немного, чтобы сказать, что действительная причина, по которой она не является детерминированной, связана просто с внешней зависимостью от получения информации из реестра? Конечно, почему он должен получать информацию оттуда, а не жестко запрограммирован в коде приложения (т.е. основной причине), в основном из-за того, как часто меняются правила DST, и из- за того, что могут быть введены новые часовые пояса, но это действительно вторично, верно? Но независимо от «почему» любая внешняя зависимость должна сделать любую функцию недетерминированной.
Соломон Руцкий
1
Потрясающие! К вашему сведению, я нашел здесь довольно интересную информацию - en.wikipedia.org/wiki/Tz_database - которая, кажется, является одним из немногих документов (по крайней мере, которые я мог найти до сих пор), которые указывают, что DST не единственная вещь изменить. Из того, что я могу судить по просмотру файла C: \ Windows \ Globalization \ Time Zone \ timezones.xml , даже базовые смещения могут меняться со временем, хотя, я полагаю, реже, чем с 1970 года. +1 :-) (пришлось репостить это, так как в ссылке был плохой персонаж)
Соломон Руцкий
1

Я добавил AT TIME ZONE в недетерминированный список по теме «Детерминированный и недетерминированный», а в теме «AT TIME ZONE» я добавил: поскольку некоторая информация (например, правила часового пояса) поддерживается за пределами SQL Server и подвержена случайным изменениям, функция AT TIME ZONE классифицируется как недетерминированная. Спасибо, что подняли это. Рик Бихам, Электронная документация по SQL Server.

Рик Бихам не подразумевает никаких гарантий
источник
2
Это должен быть комментарий, а не ответ!
Кин Шах,