sql >> Databasteknik >  >> RDS >> PostgreSQL

Konstig tidszonshantering i en Postgres-databas

Problemet verkar inte ha något samband med Amazon RDS:det har att göra med konventionen som används av PostgreSQL. I det här fallet gör du har tidszonsnamnet bakåt. Du menar 'UTC-01' där du skriver 'UTC+01' .
Från handboken :

Så tidszonsträng som används för SET TIME ZONE (och visningen av SHOW timezone , i enlighet med detta) eller AT TIME ZONE konstruera använd motsatta tecknet av vad som visas i timestamp (with time zone ) bokstavliga! Det är en mycket olycklig oenighet mellan ISO och SQL-standard å ena sidan och POSIX å andra sidan. (Jag tror att POSIX är skyldig.) Se:

Men 'CET' eller 'UTC-01' är båda fortfarande potentiellt fel för Paris eftersom de inte tar regler för sommartid hänsyn.
(Sommartid är ett av de mest idiotiska begreppen i mänsklighetens historia.)

Paris (som större delen av Europa) använder CET under vintern och CEST under sommaren. Dina tester med 'CET' råkar bara jobba i november. Om du provar samma på sommaren får du fel resultat.

För att vara på den säkra sidan, använd alltid tidszonsnamnet 'Europe/Paris' , som tar hänsyn till sommarregler. Samtalet är dyrare.

Funktionen current_time tar hänsyn till sommarregler om din tidszonsinställning innebär några. Men 'UTC-01' är en vanlig tidsförskjutning. Jag använder aldrig datatypen time with time zone eller current_time till att börja med. Manualen ännu en gång:

Tänk på:

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

Relaterat:




  1. Hur man installerar Apache Cassandra på Ubuntu 20.10/Ubuntu 20.04

  2. Hur kan jag fylla i SQLAlchemy-databasfält automatiskt? (Flask-SQLAlchemy)

  3. Behöver jag htmlentities() eller htmlspecialchars() i förberedda uttalanden?

  4. SQL cast datetime