366 votes

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

Sont les valeurs timestamp stocké différemment dans PostgreSQL lorsque le type de données est - WITH TIME ZONE contre WITHOUT TIME ZONE? Peut les différences être illustré avec de simples cas de test?

314voto

bignose Points 6573

Les différences sont couverts à la documentation PostgreSQL pour les types date/heure. Oui, le stockage de l' TIME ou TIMESTAMP varie entre un WITH TIME ZONE ou WITHOUT TIME ZONE.

Les effets de fuseaux sur ces types de données est traité dans les docs. La différence vient du fait que, avec un fuseau horaire dans le cadre de la valeur, la valeur peut être rendu par une, heure locale, dans le client, alors que, sans un fuseau horaire en valeur le sens que le rendu de la valeur de l'heure UTC.

Le comportement diffère selon au moins trois facteurs:

  • le fuseau horaire dans le client
  • type de données (c - 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)

26voto

serby Points 1425

Voici un exemple qui devrait vous aider. Si vous avez un horodatage avec un fuseau horaire, vous pouvez convertir le timestamp dans un autre fuseau horaire. Si vous n'avez pas une base de fuseau horaire il ne vous sera pas convertis correctement.

SELECT now(), now()::timestamp, now() AT TIME ZONE 'CST', now()::timestamp AT TIME ZONE 'CST'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X