sql >> Database >  >> RDS >> PostgreSQL

Eigenaardige verwerking van tijdzones in een Postgres-database

Het probleem lijkt niets met Amazon RDS te maken te hebben:het heeft te maken met de conventie die door PostgreSQL wordt gebruikt. In dit geval doe je hebben de naam van de tijdzone achteruit. Je bedoelt 'UTC-01' waar je 'UTC+01' . schrijft .
Van de handleiding :

Dus tijdzonetekenreeks gebruikt voor SET TIME ZONE (en de weergave van SHOW timezone , dienovereenkomstig) of de AT TIME ZONE constructie gebruik het tegengestelde teken van wat wordt weergegeven in timestamp (with time zone ) letterlijk! Dat is een zeer ongelukkige onenigheid tussen ISO en SQL-standaard aan de ene kant en POSIX aan de andere kant. (Ik denk dat POSIX de schuldige is.) Zie:

Maar 'CET' of 'UTC-01' hebben beide nog steeds potentieel ongelijk voor Parijs omdat ze geen regels hanteren voor zomertijd rekening mee.
(DST is een van de meest idiote concepten in de geschiedenis van de mensheid.)

Parijs (zoals het grootste deel van Europa) gebruikt CET in de winter en CEST in de zomer. Uw tests met 'CET' werk toevallig in november. Als je hetzelfde probeert in de zomer, krijg je het verkeerde resultaat.

Gebruik voor de zekerheid altijd de naam van de tijdzone 'Europe/Paris' , die rekening houdt met DST-regels. Het gesprek is duurder.

De functie current_time houdt rekening met DST-regels als uw tijdzone-instelling dit impliceert. Maar 'UTC-01' is een duidelijke tijdsverschuiving. Ik gebruik nooit het gegevenstype time with time zone of current_time beginnen met. Nogmaals de handleiding:

Overweeg:

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

Gerelateerd:




  1. Een array met waarden verzenden naar een sql-query in ruby?

  2. Waarom Opgeslagen Procedure sneller is dan Query

  3. Waarom kan ik geen variabele gebruiken in een postgres backslash-opdracht (\COPY)

  4. MariaDB NULLIF() uitgelegd