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

Regnskab for sommertid i Postgres, ved valg af planlagte varer

Brug timestamp with time zone (timestamptz ) til beregninger.
Tidspunkter for alarmer kan være time [without time zone] .
Men du skal gemme tidszonen eksplicit for hver række.

Aldrig brug time with time zone Det er en logisk brudt type, dens brug frarådes af PostgreSQL. Manualen:

Demo opsætning:

CREATE TABLE alarm(name text, t time, tz text);
INSERT INTO alarm VALUES
  ('Alfred', '04:00', 'Europe/Stockholm') -- Alfred sets an alarm for 4 AM.
, ('Lotta',  '05:00', 'Europe/Stockholm') -- Lotta sets an alarm for 5 AM. 
, ('Sharon', '11:00', 'Asia/Singapore');  -- Sharon has set an alarm for 11 AM.

Det skal være tidszone-navne (ikke forkortelser) for at tage højde for sommertid. Relateret:

Få matchende alarmer for "i dag":

SELECT *
FROM   alarm
WHERE  (('2012-07-01'::date + t) AT TIME ZONE tz AT TIME ZONE 'UTC')::time
       = '03:00'::time
  • ('2012-7-1'::date + t) ... samle timestamp [without time zone] Kunne også bare være now()::date + t for "i dag".
  • AT WITH TIME ZONE tz ... placere tidsstemplet i den gemte tidszone, hvilket resulterer i timestamptz .
  • AT WITH TIME ZONE 'UTC' ... få i henhold til UTC timestamp
  • ::time ... enkleste måde at udtrække tidskomponenten.

Her kan du slå tidszonenavne :

SELECT *
FROM   pg_timezone_names
WHERE  name ~~* '%sing%'
LIMIT  10

SQL Fiddle demonstrerer sommer/vinter.



  1. SQL Server ROUND() Funktion:Hvad er det til, og hvorfor skal du bekymre dig?

  2. JDBC-tegnkodning

  3. Lagring af lignende entiteter i den samme tabel vs i flere tabeller i databasen

  4. Bedre måde end flere SELECT-udsagn?