Postgres exibe algum comportamento estranho ao analisar fusos horários, ou simplesmente não entendo como funciona.
Da documentação :
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST'; Result: 2001-02-16 18:38:40
O exemplo usa um carimbo de data/hora especificado em EST (UTC-5) e o converte para a hora local em MST (UTC-7).
Isso parece implicar que 'MST' é intercambiável com 'UTC-7', mas o comportamento é oposto ao esperado.
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'UTC-7';
Result: 2001-02-17 08:38:40
Em vez de usar o fuso horário 'UTC-7', está usando 'UTC+7', que é 14 horas diferente.
O uso da notação de fuso horário ISO 8601 também produz o oposto do resultado esperado:
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-7';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-07';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-07:00';
Result: 2001-02-17 08:38:40
A única notação ISO 8601 que gerou um erro foi a -0700
notação.
Outras notações sem sentido são aceitas, mesmo que não façam nenhum sentido:
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-7MST';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST-7';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-7+7';
Result: 2001-02-17 08:38:40
Alguém pode me ajudar a entender como os fusos horários, especificamente a notação de deslocamento, funcionam ou deveriam funcionar no Postgres.