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

Besynderlig tidszonehåndtering i en Postgres-database

Problemet ser ikke ud til at være relateret til Amazon RDS:det har at gøre med den konvention, der bruges af PostgreSQL. I dette tilfælde gør du har tidszonenavnet tilbage. Du mener 'UTC-01' hvor du skriver 'UTC+01' .
Fra manualen :

Så tidszonestreng brugt til SET TIME ZONE (og visningen af ​​SHOW timezone , i overensstemmelse hermed) eller AT TIME ZONE konstruer brug det modsatte tegn af det, der vises i timestamp (with time zone ) bogstaver! Det er en meget uheldig uenighed mellem ISO og SQL standard på den ene side og POSIX på den anden side. (Jeg tror, ​​POSIX har skylden.) Se:

Men 'CET' eller 'UTC-01' er begge stadig potentielt forkerte for Paris, fordi de ikke tager regler for sommertid tages i betragtning.
(DST er et af de mest idiotiske begreber i menneskehedens historie.)

Paris (som det meste af Europa) bruger CET om vinteren og CEST om sommeren. Dine tests med 'CET' tilfældigvis arbejde i november. Hvis du prøver det samme om sommertiden, får du det forkerte resultat.

For at være på den sikre side skal du altid bruge tidszonenavnet 'Europe/Paris' , som overvejer DST-regler. Opkaldet er dyrere.

Funktionen current_time tager DST-regler i betragtning, hvis din tidszoneindstilling indebærer nogen. Men 'UTC-01' er en almindelig tidsforskydning. Jeg bruger aldrig datatypen time with time zone eller current_time til at starte med. Manualen endnu en gang:

Overvej:

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

Relateret:




  1. Hvordan opregner man alle aktiverede roller for alle brugere i PostgreSQL?

  2. MySQL LIMIT i en korreleret underforespørgsel

  3. Henter java.sql.SQLEundtagelse:Betjening er ikke tilladt efter ResultSet lukket

  4. Sådan kopierer du SQLite-database fra Android til en MySQL-database (replikér/synkroniser)