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?
Réponses
Trop de publicités?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
ouWITHOUT 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)
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'