Azure SQL Database – Função getdate() com valor errado no Azure. É isso mesmo?
Fala Pessoal,
Finalmente temos um cliente onde realizamos um suporte e monitoramento mensal indo para o Azure, ou seja, muitos posts para vocês com experiências e casos do Dia a Dia que vivenciaremos no Azure SQL database.
Serão desde dicas mais simples como essa de hoje até dicas mais complexas como rotinas de ADM que ainda precisamos executar no Azure.
Como criar uma base no Azure vocês podem ver nesse post do Tiago Neves abaixo:
https://www.tiagoneves.net/blog/criando-um-banco-de-dados-sqldatabase/
Após criar uma base e conectar, executei o tão utilizado comando select getdate() e o bendito vem um valor diferente do nosso horário de Brasília. Vixe!
No meu caso aqui em Vitória-ES, o Azure fica 3 horas adiantado do meu horário local.
Mas Fabrício, e se eu criar a minha base no Datacenter do Brasil, isso também acontece?
R: Sim. Mesma coisa.
O serviço de banco de dados do Azure (Paas), sempre utiliza o UTC como time zone para suas bases, dessa forma você consegue mudar uma base entre data centers de diferentes continentes sem ter que mudar nada com relação a datas no seu banco.
Entendi Fabrício. Mas a solução é fácil então. Coloco um dateadd -3 horas no getdate e está resolvido.
Gambiarra! E o horário de verão?
Verdade Fabrício. Como faço então?
Quando fizer uma busca no google, vai achar alguém falando da utilização do comando “AT TIME ZONE” junto com o seu Getdate().
Exemplo:
1 |
SELECT GETDATE() AT TIME ZONE 'Central European Standard Time' |
Resultado: 2018-07-05 18:29:43.613 +02:00
Massa Fabrício. Como sei qual é o meu time zone?
Com esse comando PowerShell pegamos:
Podemos procurar se ele existe no azure na query abaixo:
*is_currently_dst – True se atualmente observando o horário de verão.
Certo Fabrício. Então é só usar o getdate() conforme abaixo que meu problema está resolvido.
Ops. Deu ruim. A hora continua vindo 3 horas adiantada do meu horário local, que nesse momento da execução era 15h36min.
E agora? Escolhi o Time Zone errado?
Não. É um pouco confuso, mas temos que transformar o getdate() para o formato datetimeoffset primeiro antes de convertê-lo para o nosso time zone.
Agora sim a hora está correta!!! YES!!!
Você tem uma segunda opção de rodar direto o comando SYSDATETIMEOFFSET() e converter para o nosso Time Zone:
Pronto.
Agora você pode criar sua própria função de getdate() e dar aquele replace em todas as views, procedures, default constraints e functions quando for criar esses objetos no Azure.
1 2 3 4 5 6 7 8 9 |
CREATE FUNCTION dbo.getdate2() RETURNS datetime WITH SCHEMABINDING AS begin DECLARE @getdate datetime SET @getdate = SYSDATETIMEOFFSET() AT TIME ZONE 'E. South America Standard Time' RETURN @getdate end |
A função pode ser usada dessa forma:
Meu horário correto e 16h14min no momento dessa execução.
É isso aí pessoal.
Até a próxima dica de como utilizar o Azure SQL Database no seu dia a dia de trabalho.
Abraços,
Fabrício Lima
Microsoft Data Platform MVP
Consultor e Instrutor SQL Server
Trabalha com SQL Server desde 2006
Um bom caso Fabricio… nao seria legal criar esta function com o with schemabinding
Boa… Sempre vai ter um para tentar fazer besteira…
Incluído no script.
Obrigado.
Ao ler esse caso me lembrei de outro em que era necessário calcular a diferença entre dois horários (data e hora), sendo que entre esses dois horários ocorreu a alteração de fuso horário no computador. A função datediff() retornava resultado errado. A soluçao foi justamente o emprego de
at time zone ‘E. South America Standard Time’
para que datediff() retornasse valores corretos.
Boa josé.
Obrigado por compartilhar!
Excelente Fabricio! A princípio esse comportamento será igual no Managed Instances, certo?
Fala Júlio,
Até onde vi eles estão tentando melhorar no MI, mas não sei dizer se já vai sair assim.
Olha esse link:
https://feedback.azure.com/forums/217321-sql-database/suggestions/18739267-need-the-ability-to-set-a-time-zone-per-azure-sql