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.
Em vez de usar o fuso horário 'UTC-7', está usando 'UTC+7', que é 14 horas diferente.
Depende se +/- significa leste ou oeste de Greenwich, e acontece que ambas as convenções existem. O documento do PostgreSQL adverte sobre isso:
http://www.postgresql.org/docs/current/static/datatype-datetime.html
Trecho de 8.5.3. Fusos horários (mas você realmente quer ler o parágrafo inteiro):
O uso da notação de fuso horário ISO 8601 também produz o oposto do resultado esperado:
Na mesma página, os formatos aceitos para literais de fuso horário são listados, aqui está uma versão condensada:
Observe que ele nunca finge aceitar um designador de fuso horário ISO 8601. E como você descobriu com
-0700
, não. Você deve apenas usar um dos formulários acima.Cuidado também com as conclusões (falsas) de que, como o analisador não rejeita um fuso horário, é válido: