Чому В ЦЕНТРОВІЙ ЗОНІ недетермінований?


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перегляд, а не статична довідкова таблиця, її потрібно обчислювати залежно від значень реєстру, які мають найбільш актуальну інформацію про часовий пояс.


1
Але чи не слід це обчислювати по відношенню до дати перетворення? Якщо це не детерміновано, це тому, що правило, щодо якого починається літній день, може змінитися в майбутньому, як це було в 2009 році.
Random832

@ Random832 Правильно! Я пропустив деякі деталі для цього, я оновив, щоб бути більш зрозумілим.
LowlyDBA

2
@ Random832, враховуйте не лише минулі дати, а й майбутні дати. Якщо майбутня дата буде збережена на основі правил зміни часу, які існують сьогодні, значення стане недійсним, якщо правила змінюватимуться відтепер,
Ден Гузман

1
Джон: це хороша інформація, але хіба не було б технічно точніше переставити це трохи, щоб сказати, що фактична причина того, що вона не детермінована, пов’язана лише із зовнішньою залежністю від отримання інформації з реєстру? Звичайно, чому він повинен отримувати інформацію звідти, на відміну від жорсткого кодування в коді програми (тобто першопричини), в основному, через те, як часто змінюються правила DST, і те, що нові часові зони можна вводити, але це насправді другорядне, правда? Але незалежно від "чому" будь-яка зовнішня залежність повинна робити будь-яку функцію недетермінованою.
Соломон Руцький

1
Дивовижно! FYI, я знайшов тут досить цікаву інформацію - en.wikipedia.org/wiki/Tz_database - це, здається, один з небагатьох документів (принаймні, які я міг знайти досі), які свідчать про те, що DST - не єдине, що змінювати. З того, що я можу сказати, переглядаючи файл C: \ Windows \ Globalization \ Time Zone \ timezones.xml , навіть базові зрушення можуть змінюватися з часом, хоча рідше починаючи з 1970 року. +1 :-) (довелося репостувати це, оскільки посилання мала поганий характер)
Соломон Руцький

1

Я додав НА ЧАС ЗОМУ до недетермінованого списку на тему «Детерміновані» та «Недетерміновані», а в тему В ЧАСОВІЙ ЗОНИ я додав: Оскільки деяка інформація (наприклад, правила часового поясу) зберігається поза SQL Server і підлягає періодичній зміні, функція AT TIME ZONE класифікується як недетермінована. Дякую за те, що ви підняли це. Рік Байхам, Книги SQL Server Online.


2
Це повинен бути коментар, а не відповідь!
Кін Шах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.