Atualmente, uso o seguinte para obter um datetime local a partir de um UTC datetime:
SET @offset = DateDiff(minute, GetUTCDate(), GetDate())
SET @localDateTime = DateAdd(minute, @offset, @utcDateTime)
Meu problema é que, se o horário de verão ocorrer entre GetUTCDate()
e @utcDateTime
, @localDateTime
termina em uma hora de folga.
Existe uma maneira fácil de converter de utc para hora local em uma data que não seja a data atual?
Estou usando o SQL Server 2005
WITH PERMISSION_SET = UNSAFE
. Alguns ambientes não permitem isso como o AWS RDS. E é, bem, inseguro. Infelizmente, não existe uma implementação completa do fuso horário .Net que possa ser usada semunsafe
permissão. Veja aqui e aqui .Eu desenvolvi e publiquei o projeto T-SQL Toolbox no codeplex para ajudar qualquer pessoa que lute com o processamento de data e hora e fuso horário no Microsoft SQL Server. É de código aberto e totalmente gratuito.
Oferece UDFs de conversão de data / hora fáceis usando T-SQL simples (sem CLRs), além de tabelas de configuração pré-preenchidas prontas para uso. E possui suporte completo ao horário de verão (DST).
Uma lista de todos os fusos horários suportados pode ser encontrada na tabela "DateTimeUtil.Timezone" (fornecida no banco de dados T-SQL Toolbox).
No seu exemplo, você pode usar o seguinte exemplo:
Isso retornará o valor da data e hora local convertido.
Infelizmente, ele é suportado no SQL Server 2008 ou posterior apenas devido aos tipos de dados mais recentes (DATE, TIME, DATETIME2). Porém, como o código-fonte completo é fornecido, você pode ajustar facilmente as tabelas e UDFs, substituindo-os por DATETIME. Não tenho um MSSQL 2005 disponível para teste, mas ele deve funcionar com o MSSQL 2005 também. Em caso de perguntas, é só me avisar.
fonte
Eu sempre uso esse comando TSQL.
É muito simples e faz o trabalho.
fonte
Encontrei esta resposta no StackOverflow que fornece uma função definida pelo usuário que parece traduzir com precisão as datas e horários
A única coisa que você precisa modificar é a
@offset
variável na parte superior para defini-la como o deslocamento do fuso horário do servidor SQL executando esta função. No meu caso, nosso servidor SQL usa EST, que é GMT - 5Não é perfeito e provavelmente não funcionará em muitos casos, com desvios de TZ de meia hora ou 15 minutos (para aqueles que eu recomendaria uma função CLR como Kevin recomendou ), mas funciona bem o suficiente para a maioria dos fusos horários genéricos no norte América.
fonte
Para o SQL Server 2016 ou superior, você pode usar o FUSO HORÁRIO . Ele irá lidar automaticamente com o horário de verão.
fonte
Há algumas boas respostas para uma pergunta semelhante feita no Stack Overflow. Acabei usando uma abordagem T-SQL da segunda resposta de Bob Albright para limpar uma bagunça causada por um consultor de conversão de dados.
Ele funcionou para quase todos os nossos dados, mas depois percebi que seu algoritmo só funciona em datas já em 5 de abril de 1987 , e tínhamos algumas datas da década de 1940 que ainda não foram convertidas corretamente. Finalmente, precisávamos das
UTC
datas em nosso banco de dados do SQL Server para alinhar com um algoritmo em um programa de terceiros que usava a API Java para converterUTC
para a hora local.Gosto do
CLR
exemplo da resposta de Kevin Feasel acima, usando o exemplo de Harsh Chawla, e também gostaria de compará-lo a uma solução que usa Java, já que nosso front end usa Java para fazer aUTC
conversão para a hora local.A Wikipedia menciona oito emendas constitucionais diferentes que envolvem ajustes de fuso horário anteriores a 1987, e muitas delas são muito localizadas em estados diferentes; portanto, há uma chance de que o CLR e Java possam interpretá-las de maneira diferente. Seu código de aplicativo front-end usa dotnet ou Java ou as datas anteriores a 1987 são um problema para você?
fonte
Você pode fazer isso facilmente com um procedimento armazenado CLR.
Você pode armazenar os fusos horários disponíveis em uma tabela:
E esse procedimento armazenado preencherá a tabela com os possíveis fusos horários no seu servidor.
fonte
WITH PERMISSION_SET = UNSAFE
. Alguns ambientes não permitem isso como o AWS RDS. E é, bem, inseguro. Infelizmente, não há uma implementação completa do fuso horário .Net que possa ser usada semunsafe
permissão. Veja aqui e aqui .O SQL Server versão 2016 resolverá esse problema de uma vez por todas . Para versões anteriores, uma solução CLR é provavelmente mais fácil. Ou para uma regra específica de horário de verão (como apenas nos EUA), uma função T-SQL pode ser relativamente simples.
No entanto, acho que uma solução T-SQL genérica pode ser possível. Desde que
xp_regread
funcione, tente o seguinte:Uma função T-SQL (complexa) pode usar esses dados para determinar o deslocamento exato para todas as datas durante a regra de horário de verão atual.
fonte
fonte
Aqui está uma resposta escrita para um aplicativo específico do Reino Unido e baseada exclusivamente no SELECT.
Não aplicável entre meia-noite e 01:00 no horário de verão. Isso pode ser corrigido, mas o aplicativo para o qual foi escrito não exige.
fonte