As diferenças são abordadas na documentação do PostgreSQL para tipos de data/hora. Sim, o tratamento de
TIME
ou TIMESTAMP
difere entre um WITH TIME ZONE
ou WITHOUT TIME ZONE
. Não afeta como os valores são armazenados; afeta como eles são interpretados. Os efeitos dos fusos horários nesses tipos de dados são abordados especificamente nos documentos. A diferença surge do que o sistema pode razoavelmente saber sobre o valor:
-
Com um fuso horário como parte do valor, o valor pode ser renderizado como um horário local no cliente.
-
Sem um fuso horário como parte do valor, o fuso horário padrão óbvio é UTC, portanto, ele é renderizado para esse fuso horário.
O comportamento difere dependendo de pelo menos três fatores:
- A configuração de fuso horário no cliente.
- O tipo de dados (ou seja,
WITH TIME ZONE
ouWITHOUT TIME ZONE
) do valor. - Se o valor é especificado com um fuso horário específico.
Aqui estão exemplos que cobrem as combinações desses fatores:
foo=> SET TIMEZONE TO 'Japan';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 00:00:00+09
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 06:00:00+09
(1 row)
foo=> SET TIMEZONE TO 'Australia/Melbourne';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 00:00:00+11
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
timestamp
---------------------
2011-01-01 00:00:00
(1 row)
foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
timestamptz
------------------------
2011-01-01 08:00:00+11
(1 row)