PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Différence entre les horodatages avec/sans fuseau horaire dans PostgreSQL

Les différences sont traitées dans la documentation de PostgreSQL pour les types date/heure. Oui, le traitement de TIME ou TIMESTAMP diffère entre un WITH TIME ZONE ou WITHOUT TIME ZONE . Cela n'affecte pas la façon dont les valeurs sont stockées; cela affecte la façon dont ils sont interprétés.

Les effets des fuseaux horaires sur ces types de données sont traités spécifiquement dans la documentation. La différence provient de ce que le système peut raisonnablement savoir sur la valeur :

  • Avec un fuseau horaire dans le cadre de la valeur, la valeur peut être rendue sous forme d'heure locale dans le client.

  • Sans fuseau horaire dans la valeur, le fuseau horaire par défaut évident est UTC, il est donc rendu pour ce fuseau horaire.

Le comportement diffère en fonction d'au moins trois facteurs :

  • Le paramètre de fuseau horaire dans le client.
  • Le type de données (c'est-à-dire WITH TIME ZONE ou WITHOUT TIME ZONE ) de la valeur.
  • Si la valeur est spécifiée avec un fuseau horaire particulier.

Voici des exemples couvrant les combinaisons de ces facteurs :

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)