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.
sql-server
sql-server-2016
timezone
Бен Грибаудо
источник
источник
Ответы:
AT TIME ZONE
использует некоторую логику для расчета перехода на летнее время. Значения смещения DST не являются неизменяемыми (они могут изменяться через обновления Windows ) и содержатся внешне в реестре Windows, поэтомуAT TIME ZONE
функция не может быть детерминированной, так как она полагается на внешние данные.Аналогичным образом, именно поэтому
sys.time_zone_info
это представление, а не статическая справочная таблица, его необходимо рассчитывать в зависимости от значений реестра, которые содержат самую актуальную информацию о часовом поясе.источник
Я добавил AT TIME ZONE в недетерминированный список по теме «Детерминированный и недетерминированный», а в теме «AT TIME ZONE» я добавил: поскольку некоторая информация (например, правила часового пояса) поддерживается за пределами SQL Server и подвержена случайным изменениям, функция AT TIME ZONE классифицируется как недетерминированная. Спасибо, что подняли это. Рик Бихам, Электронная документация по SQL Server.
источник