Använd timestamp with time zone
(timestamptz
) för beräkningar.
Tiderna för larm kan vara time [without time zone]
.
Men du måste spara tidszonen uttryckligen för varje rad.
Aldrig använd time with time zone
Det är en logiskt trasig typ, dess användning avskräcks av PostgreSQL. Manualen:
Demoinställningar:
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 måste vara tidszons namn (inte förkortningar) för att redogöra för sommartid. Relaterat:
Få matchande larm för "idag":
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)
... monteratimestamp [without time zone]
Kan också bara varanow()::date + t
för "idag".AT WITH TIME ZONE tz
... placera tidsstämpel i den sparade tidszonen, vilket resulterar itimestamptz
.AT WITH TIME ZONE 'UTC'
... få enligt UTCtimestamp
::time
... enklaste sättet att extrahera tidskomponenten.
Här kan du slå upp tidszonnamn :
SELECT *
FROM pg_timezone_names
WHERE name ~~* '%sing%'
LIMIT 10
SQL Fiddle demonstrerar sommar/vinter.