O SQL Server 2016 adicionou o AT TIME ZONE
operador. Da documentação :
A implementação AT TIME ZONE depende de um mecanismo do Windows para converter valores de data e hora entre fusos horários.
AT TIME ZONE
chama o mscorlib.ni!TimeZoneInfo.ConvertTime
método de acordo com o rastreamento ETW em uma consulta simples. Jonathan Kehayias tem uma postagem no blog onde ele extrai todas as regras de fuso horário da System.TimeZoneInfo
classe. Só consigo encontrar regras que tenham efeito em 01/01/2004 ou posterior na saída:
Rob Farley menciona que em um post de blog que uma mudança de regra de fuso horário no ano 2000 não parece ser respeitada por AT TIME ZONE
:
Ele funciona usando o registro do Windows, que contém todas essas informações, mas, infelizmente, não é perfeito quando se olha para trás no tempo. A Austrália mudou as datas em 2008, e os EUA mudaram suas datas em 2005 – ambos os países economizando a luz do dia durante a maior parte do ano. AT TIME ZONE entende isso. Mas não parece apreciar que na Austrália no ano 2000, graças às Olimpíadas de Sydney, a Austrália começou o horário de verão cerca de dois meses antes.
Eu sinto que há uma grande quantidade de evidências circunstanciais de que o AT TIME ZONE
operador pode retornar resultados imprecisos para datas anteriores ao ano de 2004. No entanto, não consigo encontrar nenhuma documentação que AT TIME ZONE
use a System.TimeZoneInfo
classe, que AT TIME ZONE
possa ser imprecisa para datas mais antigas ou que a System.TimeZoneInfo
classe pode ser impreciso para datas mais antigas.
Existe uma limitação do produto SQL Server que resulta no AT TIME ZONE
retorno de resultados imprecisos antes do ano de 2004?
Não sei se isso é definitivo, mas encontrei este Q&A no Stack Overflow que inclui uma resposta de um ex-funcionário da Microsoft ( ênfase minha):
O .NET tem o histórico de alterações de fuso horário?
Então, basicamente, o SQL Server está chamando o .NET, o .NET está procurando no registro do Windows e não é garantido que o registro do Windows tenha um histórico completo de alterações de fuso horário. Como você notou, nas versões modernas do Windows 10, as regras de ajuste mais antigas que estou vendo são de 2003.
Se você precisar de um histórico mais antigo do que isso, terá que sair do SQL Server / do código de biblioteca .NET Framework integrado. Ouvi coisas boas sobre o NodaTime (que obtém suas informações do banco de dados de fuso horário oficial da IANA), então você pode usar esta solução de código aberto construída em cima de alguma infraestrutura desse projeto:
Suporte a fuso horário do SQL Server - GitHub
Você também pode lançar sua própria solução se for uma pessoa ruim e odiar o código aberto (ou apenas quiser ou qualquer outra coisa).