PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Berücksichtigung der Sommerzeit in Postgres bei der Auswahl geplanter Elemente

Verwenden Sie timestamp with time zone (timestamptz ) für Berechnungen.
Zeiten für Alarme können time [without time zone] sein .
Aber Sie müssen die Zeitzone speichern explizit für jede Zeile.

Niemals Verwenden Sie time with time zone Es ist ein logisch fehlerhafter Typ, von dessen Verwendung PostgreSQL abrät. Das Handbuch:

Demo-Setup:

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.

Es müssen Zeitzonen-Namen sein (keine Abkürzungen) zur Berücksichtigung der Sommerzeit. Verwandte:

Passende Alarme für „heute“ abrufen:

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) ... timestamp [without time zone] zusammenbauen Könnte auch nur now()::date + t sein für "heute".
  • AT WITH TIME ZONE tz ... platzieren Sie den Zeitstempel in der gespeicherten Zeitzone, was zu timestamptz führt .
  • AT WITH TIME ZONE 'UTC' ... erhalten den entsprechenden UTC timestamp
  • ::time ... einfachste Möglichkeit, die Zeitkomponente zu extrahieren.

Hier können Sie Zeitzonennamen :

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

SQL-Fiddle zeigt Sommer / Winter.