Loading…

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:

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.

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

6 thoughts on “Azure SQL Database – Função getdate() com valor errado no Azure. É isso mesmo?

  1. 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.

Deixe uma resposta

%d blogueiros gostam disto: