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

Gestion particulière du fuseau horaire dans une base de données Postgres

Le problème ne semble pas lié à Amazon RDS :il a à voir avec la convention utilisée par PostgreSQL. Dans ce cas, vous faites avoir le nom du fuseau horaire en arrière. Vous voulez dire 'UTC-01' où vous écrivez 'UTC+01' .
D'après le manuel :

Donc chaîne de fuseau horaire utilisée pour SET TIME ZONE (et l'affichage de SHOW timezone , en conséquence) ou le AT TIME ZONE construire utiliser le signe opposé de ce qui est affiché dans timestamp (with time zone ) littéraux ! C'est un désaccord très malheureux entre les normes ISO et SQL d'une part et POSIX d'autre part. (Je pense que POSIX est à blâmer.) Voir :

Mais 'CET' ou 'UTC-01' sont tous les deux potentiellement faux pour Paris parce qu'ils ne prennent pas de règles pour l'heure d'été en compte.
(L'heure d'été est l'un des concepts les plus débiles de l'histoire de l'humanité.)

Paris (comme la plupart de l'Europe) utilise CET en hiver et CEST en été. Vos tests avec 'CET' arrive juste de travailler en novembre. Si vous essayez la même chose en été, vous obtenez un mauvais résultat.

Pour plus de sécurité, utilisez toujours le nom du fuseau horaire 'Europe/Paris' , qui prend en compte les règles DST. L'appel est plus cher.

La fonction current_time prend en compte les règles DST si votre réglage de fuseau horaire en implique. Mais 'UTC-01' est un simple décalage horaire. Je n'utilise jamais le type de données time with time zone ou current_time pour commencer. Le manuel une fois de plus :

Considérez :

SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC+01' AS plus_wrong
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC-01' AS minus_right
SELECT '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'CET'    AS cet_winter
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CEST'   AS cest_summer
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CET'    AS cet_no_dst  -- CET wrong!
SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_summer
     , '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_winter

Connexe :