Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Alterar o deslocamento de fuso horário em um valor datetimeoffset no SQL Server (T-SQL)


Você pode usar o SWITCHOFFSET() função no SQL Server para alterar o deslocamento de fuso horário em um datetimeoffset valor.

A função aceita dois argumentos; um deslocamento de data e hora(n) valor (ou uma expressão que pode ser resolvida para um datetimeoffset(n) valor) e o novo fuso horário.

Exemplo


Aqui está um exemplo para demonstrar.
DECLARE @dto datetimeoffset = '2020-12-20 17:33:59.8900000 +02:00';
SELECT
  @dto AS [Original],
  SWITCHOFFSET(@dto, '+04:00') AS [Modified];

Resultado (usando saída vertical):
Original | 2020-12-20 17:33:59.8900000 +02:00
Modified | 2020-12-20 19:33:59.8900000 +04:00

Observe que o deslocamento de fuso horário é especificado como uma string. Isso é porque eu forneci em horas.

Quando especificado em horas, o deslocamento de fuso horário deve usar o formato [+|-]TZH:TZM e ser especificado como uma string (entre aspas simples).

Usar minutos como deslocamento de fuso horário


Você também pode especificar o deslocamento do fuso horário em minutos. Ao fazer isso, você deve especificá-lo como um número inteiro.
DECLARE @dto datetimeoffset = '2020-12-20 17:33:59.8900000 +02:00';
SELECT
  @dto AS [Original],
  SWITCHOFFSET(@dto, 240) AS [Modified];

Resultado (usando saída vertical):
Original | 2020-12-20 17:33:59.8900000 +02:00
Modified | 2020-12-20 19:33:59.8900000 +04:00

Exemplo de banco de dados


Aqui está um exemplo de uso de SWITCHOFFSET() no valor de uma coluna em uma tabela de banco de dados.
CREATE TABLE Test 
  (
      Col1 datetimeoffset
  ); 
INSERT INTO Test   
VALUES ('1967-12-20 17:33:59.8900000 -07:00'); 
SELECT 
  Col1,
  SWITCHOFFSET(Col1, '-08:00') AS Modified
FROM Test;

Resultado (usando saída vertical):
Col1     | 1967-12-20 17:33:59.8900000 -07:00
Modified | 1967-12-20 16:33:59.8900000 -08:00

Desempenho ao usar um valor GETDATE()


A Microsoft aconselha que usar SWITCHOFFSET() com o GETDATE() pode fazer com que a consulta seja executada lentamente, pois o otimizador de consulta não consegue obter estimativas precisas de cardinalidade para o datetime valor.

Para resolver esse problema, use a OPTION (RECOMPILE) dica de consulta. Isso força o otimizador de consulta a recompilar um plano de consulta na próxima vez que a mesma consulta for executada.

Não sabe a diferença de fuso horário?


Se você não souber o deslocamento de fuso horário a ser usado, veja como obter uma lista de fusos horários com suporte no SQL Server.

Uma coisa que você precisa estar atento é o horário de verão. Muitos países/regiões têm suas próprias regras específicas para observar o horário de verão (e alguns não o observam). Isso pode causar todos os tipos de problemas quando você está tentando descobrir se deve ou não incluir o horário de verão em seus deslocamentos de fuso horário.

Felizmente, o SQL Server surgiu com uma maneira de lidar com isso. O SQL Server 2016 introduziu o AT TIME ZONE cláusula. Esta cláusula permite especificar o nome de um fuso horário, em vez do próprio deslocamento de fuso horário. Portanto, você pode simplesmente usar 'Horário padrão das montanhas dos EUA' ou 'Horário padrão da Índia' ou qualquer fuso horário aplicável.

Consulte Converter uma data em outro fuso horário para obter exemplos de como fazer isso.