PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Differenza tra timestamp con/senza fuso orario in PostgreSQL

Le differenze sono trattate nella documentazione di PostgreSQL per i tipi di data/ora. Sì, il trattamento di TIME o TIMESTAMP differisce tra un WITH TIME ZONE o WITHOUT TIME ZONE . Non influisce sulla modalità di archiviazione dei valori; influisce sul modo in cui vengono interpretati.

Gli effetti dei fusi orari su questi tipi di dati sono trattati in modo specifico nei documenti. La differenza deriva da ciò che il sistema può ragionevolmente sapere sul valore:

  • Con un fuso orario come parte del valore, il valore può essere visualizzato come ora locale nel client.

  • Senza un fuso orario come parte del valore, il fuso orario predefinito ovvio è UTC, quindi viene visualizzato per quel fuso orario.

Il comportamento varia a seconda di almeno tre fattori:

  • L'impostazione del fuso orario nel client.
  • Il tipo di dati (ovvero WITH TIME ZONE o WITHOUT TIME ZONE ) del valore.
  • Se il valore è specificato con un fuso orario particolare.

Ecco degli esempi che coprono le combinazioni di questi fattori:

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)