Por que AT TIME ZONE não é determinístico?

18

O SQL Server 2016 AT TIME ZONEparece não-determinístico. No entanto, não consegui encontrar documentação oficialmente declarando isso ou dando uma justificativa para o raciocínio por trás disso.

Por que AT TIME ZONEnão é determinístico?

Exemplo mostrando não determinismo

Executando:

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

Retorna o seguinte erro:

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
fonte
4
Três palavras. Horário de verão.
paparazzo
2
Bem-vindo ao pesadelo conhecido como tempo. Eu quase desejo que seja obrigatório quando você armazena tempo, você também armazena o fuso horário também. Eu economizaria muito em medicamentos para dor de cabeça.
Eric S
Acaba de criar um item de Microsoft Connect pedir documentação a ser atualizado para refletir 'não-determinismo da AT TIME ZONE.
Ben Gribaudo 26/09/16

Respostas:

20

AT TIME ZONE emprega alguma lógica para calcular o horário de verão. Os valores de deslocamento do horário de verão não são imutáveis ​​(estão sujeitos a alterações por meio de atualizações do Windows ) e estão contidos externamente no registro do Windows; portanto, a AT TIME ZONEfunção não pode ser determinística, pois depende de dados externos.

Da mesma forma, é por isso que, como sys.time_zone_infoé uma exibição e não uma tabela de referência estática, ela precisa ser calculada dependendo dos valores do registro que contêm as informações mais atualizadas sobre o fuso horário.

LowlyDBA
fonte
11
Mas não deve ser calculado com referência à data de conversão? Se é não determinística, é porque a regra de que começa poupança daylight dia em pode mudar no futuro, como aconteceu em 2009.
Random832
@ Random832 Certo! Eu pulei alguns detalhes para isso, eu atualizei para ficar mais claro.
LowlyDBA
2
@ Random832, considere não apenas datas passadas, mas datas futuras. Se uma data futura é armazenada com base nas regras de mudança de tempo que existem hoje o valor se tornará inválido se regras mudam entre agora e depois,
Dan Guzman
11
John: essa é uma boa informação, mas não seria tecnicamente mais preciso reorganizá-la um pouco para dizer que a verdadeira razão de não ser determinística se deve apenas à dependência externa de obter as informações do registro? Claro, o motivo pelo qual é necessário obter as informações de lá, em vez de ser codificado no código do aplicativo (ou seja, a causa raiz), deve-se principalmente à frequência com que as regras do horário de verão são alteradas e ao fato de que novos fusos horários podem ser introduzidos, mas isso é realmente secundário, certo? Mas, independentemente do "porquê", qualquer dependência externa deve tornar qualquer função não determinística.
Solomon Rutzky 26/09/16
11
Impressionante! Para sua informação, encontrei aqui algumas informações bastante interessantes - en.wikipedia.org/wiki/Tz_database - que parecem ser um dos poucos documentos (pelo menos que pude encontrar até agora) que indicam que o horário de verão não é a única coisa mudar. Pelo que posso ver olhando para o arquivo C: \ Windows \ Globalization \ Time Zone \ timezones.xml , até mesmo as compensações básicas podem mudar com o tempo, embora com menos frequência desde 1970, eu acho. +1 :-) (teve que repassar isso, pois o link tinha um caráter ruim) #
Solomon Rutzky
1

Adicionei AT TIME ZONE à lista não determinística sobre o tópico Deterministic and Noneterministic, e no tópico AT TIME ZONE, adicionei: Como algumas informações (como regras de fuso horário) são mantidas fora do SQL Server e estão sujeitas a alterações ocasionais, a função AT TIME ZONE é classificada como não determinística. Obrigado por trazer isso. Rick Byham, Manuais Online do SQL Server.

Rick Byham não implica nenhuma garantia
fonte
2
Este deve ser um comentário e não uma resposta!
Kin Shah