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