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 nurnow()::date + t
sein für "heute".AT WITH TIME ZONE tz
... platzieren Sie den Zeitstempel in der gespeicherten Zeitzone, was zutimestamptz
führt .AT WITH TIME ZONE 'UTC'
... erhalten den entsprechenden UTCtimestamp
::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.