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

Gestione peculiare del fuso orario in un database Postgres

Il problema sembra non correlato ad Amazon RDS:ha a che fare con la convenzione utilizzata da PostgreSQL. In questo caso, lo fai avere il nome del fuso orario indietro. Intendi 'UTC-01' dove scrivi 'UTC+01' .
Da il manuale :

Quindi stringa di fuso orario utilizzata per SET TIME ZONE (e la visualizzazione di SHOW timezone , di conseguenza) o il AT TIME ZONE costruire usa il segno opposto di ciò che viene visualizzato in timestamp (with time zone ) letterali! Questo è uno sfortunato disaccordo tra lo standard ISO e SQL da un lato e POSIX dall'altro. (Penso che la colpa sia di POSIX.) Vedi:

Ma 'CET' o 'UTC-01' sono entrambi ancora potenzialmente sbagliati per Parigi perché non stanno adottando le regole per l'ora legale in considerazione.
(L'ora legale è uno dei concetti più idioti nella storia dell'umanità.)

Parigi (come la maggior parte dell'Europa) utilizza il CET durante l'inverno e il CEST durante l'estate. I tuoi test con 'CET' capita di lavorare a novembre. Se provi lo stesso in estate, ottieni il risultato sbagliato.

Per sicurezza, usa sempre il nome del fuso orario 'Europe/Paris' , che considera le regole dell'ora legale. La chiamata è più costosa.

La funzione current_time tiene conto delle regole dell'ora legale se l'impostazione del fuso orario lo implica. Ma 'UTC-01' è un semplice sfasamento temporale. Non utilizzo mai il tipo di dati time with time zone o current_time iniziare con. Il manuale ancora una volta:

Considera:

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

Correlati: