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

Diferença entre timestamps com/sem fuso horário no PostgreSQL


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 ou WITHOUT 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)