Pergunta

Meu aplicativo de banco de dados vai ser implantado em vários locais em diferentes fusos horários.

Eu preciso de uma função T-SQL que irá determinar a hora UTC da meia-noite de 1 de Janeiro do ano em curso para cálculos acumulado no ano. Todos os dados são armazenados em UTC timestamps.

Por exemplo, Chicago é UTC-6 com o horário de verão (DST), as necessidades de função para retornar '2008-01-01 06:00:00' se executar qualquer momento em 2008, em Chicago. Se correr em Nova York (GMT-5 + DST) no próximo ano, ele precisa voltar '2009-01-01 05:00:00'.

posso obter o corrente ano de YEAR(GETDATE()). Eu pensei que eu poderia fazer um DATEDIFF entre GETDATE() e GETUTCDATE() para determinar o deslocamento, mas o resultado depende se a consulta é executado durante o horário de verão ou não. Eu não sei de qualquer construído em funções T-SQL para determinar o deslocamento ou se ou não o tempo atual é DST ou não?

Alguém tem uma solução para este problema em T-SQL? Eu poderia código rígido ou armazená-lo em uma mesa, mas prefere não. Suponho que esta é uma situação perfeita para o uso de integração CLR no SQL Server 2005. Eu estou apenas querendo saber se existe uma solução T-SQL que eu ignoro?

Foi útil?

Solução

Confira esta pergunta anterior e resposta para informações relacionadas:

Efetivamente datas entre UTC e local convertendo (ie. PST) vez em SQL 2005

(Para resumir, você precisa fazer para zona de tempo de compilação e mesas DST no SQL Server 2005. Na próxima versão do SQL Server que obter alguma ajuda com os fusos horários.)

Outras dicas

Se não me engano, a função GETUTCDATE () usa o fuso horário definido no servidor - não tem informações sobre o fuso horário do cliente (ou qualquer fuso horário). Eu não acho que a informação é armazenada em qualquer lugar no SQL Server 2005, o que torna impossível para ele para calcular esta informação.

Talvez você pudesse 'emprestar' os dados do tempo de arquivo de zona da Oracle e construir a sua própria função de SQL Server?

Off topic (poderia ser útil para alguém), mas se você estivesse usando Oracle, você pode usar a função FROM_TZ e 'AT TIME ZONE':

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'

Hmm, eu acho que eu não estou entendendo o problema. Se o aplicativo de banco de dados já está armazenando UTC timestamps para tudo isso de transações, e que pretende resumir alguns valores desde o primeiro dia do ano "tempo local", sua condição teria que ser algo como:

(timestamp + (getutcdate() - getdate())) > cast('01/01/2008' as datetime)

A DST pode ser em ou off , dependendo de quando no ano a consulta é executada - mas getdate() leva em conta, então você tem que calcular dinamicamente o deslocamento de cada vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top