Použijte timestamp with time zone
(timestamptz
) pro výpočty.
Časy pro budíky mohou být time [without time zone]
.
Musíte však uložit časové pásmo explicitně pro každý řádek.
Nikdy použijte time with time zone
Je to logicky rozbitý typ, od jeho používání odrazuje PostgreSQL. Příručka:
Nastavení ukázky:
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.
Musí to být názvy časového pásma (nikoli zkratky) k zohlednění DST. Související:
Získejte odpovídající budíky pro „dnes“:
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)
... sestavittimestamp [without time zone]
Může být také jennow()::date + t
pro „dnes“.AT WITH TIME ZONE tz
... umístit časové razítko do uloženého časového pásma, výsledkem jetimestamptz
.AT WITH TIME ZONE 'UTC'
... získat podle UTCtimestamp
::time
... nejjednodušší způsob, jak extrahovat časovou složku.
Zde můžete vyhledat názvy časových pásem :
SELECT *
FROM pg_timezone_names
WHERE name ~~* '%sing%'
LIMIT 10
SQL Fiddle demonstrující léto / zimu.