sql >> Base de Datos >  >> RDS >> PostgreSQL

Diferencia entre marcas de tiempo con/sin zona horaria en PostgreSQL

Las diferencias están cubiertas en la documentación de PostgreSQL para tipos de fecha/hora. Sí, el tratamiento de TIME o TIMESTAMP difiere entre uno WITH TIME ZONE o WITHOUT TIME ZONE . No afecta cómo se almacenan los valores; afecta cómo se interpretan.

Los efectos de las zonas horarias en estos tipos de datos se tratan específicamente en los documentos. La diferencia surge de lo que el sistema puede saber razonablemente sobre el valor:

  • Con una zona horaria como parte del valor, el valor se puede representar como una hora local en el cliente.

  • Sin una zona horaria como parte del valor, la zona horaria predeterminada obvia es UTC, por lo que se representa para esa zona horaria.

El comportamiento difiere dependiendo de al menos tres factores:

  • La configuración de la zona horaria en el cliente.
  • El tipo de datos (es decir, WITH TIME ZONE o WITHOUT TIME ZONE ) del valor.
  • Si el valor se especifica con una zona horaria particular.

Aquí hay ejemplos que cubren las combinaciones de esos factores:

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)