PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como AT TIME ZONE funciona no PostgreSQL


No PostgreSQL, você pode usar o AT TIME ZONE cláusula para converter um carimbo de data/hora em outro fuso horário.

Sintaxe


Você pode usá-lo com qualquer uma das três variantes a seguir:
timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone

Onde zone é o fuso horário para o qual você deseja que o valor à esquerda seja convertido.

Só para ficar claro, a única diferença entre as três variantes está no tipo de dados do carimbo de data/hora a ser convertido.

Os três tipos de dados são:
  • timestamp with time zone
  • timestamp without time zone
  • time with time zone

O resultado obtido dependerá do tipo de dados.

A tabela a seguir descreve o resultado que cada variante produz.
Expressão Tipo de retorno Descrição
timestamp with time zone AT TIME ZONE zone timestamp without time zone Converter determinado carimbo de hora com fuso horário para o novo fuso horário, sem designação de fuso horário
timestamp without time zone AT TIME ZONE zone timestamp with time zone Tratar determinado carimbo de hora sem fuso horário conforme localizado no fuso horário especificado
time with time zone AT TIME ZONE zone time with time zone Converter determinado horário com fuso horário para o novo fuso horário

Variante 1


Veja o que acontece quando você converte um timestamp with time zone valor.
SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Resultado:
2025-11-20 02:00:00

Quando o carimbo de data/hora original é um timestamp with time zone valor, ele é deslocado para o fuso horário especificado e o resultado é retornado sem um deslocamento de fuso horário.

Aqui está o que acontece se eu alterar o deslocamento do fuso horário do valor de entrada.
SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Resultado:
2025-11-20 01:00:00

O timestamp resultante é deslocado de acordo com o fuso horário de entrada.

E se você especificar timestamp with time zone , mas o carimbo de data/hora original não inclui um fuso horário, então o fuso horário local é assumido.
SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultado:
2025-11-19 16:00:00

Nesse caso, o timestamp resultante foi adiado em oito horas. Isso significa que meu fuso horário local está oito horas à frente da África/Cairo.

Podemos ver o deslocamento de fuso horário que foi usado selecionando o valor de entrada diretamente.
SELECT timestamp with time zone '2025-11-20 00:00:00';

Resultado:
2025-11-20 00:00:00+10

Variante 2


Veja o que acontece quando o timestamp original usa um timestamp without time zone valor.

Em outras palavras, não incluir um fuso horário.
SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultado:
2025-11-20 08:00:00+10

Quando o carimbo de data/hora original não inclui um fuso horário, o resultado é exibido usando o TimeZone atual configuração e o deslocamento do fuso horário é anexado.

Isso se aplica sempre que você especificar timestamp without time zone , mesmo que o carimbo de data/hora contenha de fato um deslocamento de fuso horário.
SELECT timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';

Resultado:
2025-11-20 08:00:00+10

Isso é esperado, porque se eu selecionar apenas o timestamp without time zone valor, isso é o que eu recebo:
SELECT timestamp without time zone '2025-11-20 00:00:00+12';

Resultado:
2025-11-20 00:00:00

Variante 3


Veja o que acontece quando o carimbo de data/hora original usa um time with time zone valor.
SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Resultado:
02:00:00+02

Ele converte o time with time zone fornecido value ao novo fuso horário e anexa o deslocamento do fuso horário ao resultado.

Aqui está o que acontece se eu alterar o deslocamento do fuso horário do valor de entrada.
SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Resultado:
01:00:00+02

O timestamp resultante é deslocado de acordo com o fuso horário de entrada.

E se você especificar time with time zone , mas o carimbo de data/hora original não inclui um fuso horário, o fuso horário local é assumido.
SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultado:
16:00:00+02

Nesse caso, o timestamp resultante foi adiado oito horas (porque meu fuso horário local está oito horas à frente da África/Cairo).

Podemos ver o deslocamento de fuso horário que foi usado selecionando o valor de entrada diretamente.
SELECT time with time zone '00:00:00';

Resultado:
00:00:00+10

Hora sem fuso horário


Embora a documentação do Postgres não inclua um time without time zone variante, aqui está um exemplo de qualquer maneira.
SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultado:
16:00:00+02

Portanto, neste exemplo, o fuso horário local foi assumido para o fuso horário a ser convertido.