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:
- Tidszonenavne med identiske egenskaber giver forskellige resultater, når de anvendes på tidsstemplet
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)
... samletimestamp [without time zone]
Kunne også bare værenow()::date + t
for "i dag".AT WITH TIME ZONE tz
... placere tidsstemplet i den gemte tidszone, hvilket resulterer itimestamptz
.AT WITH TIME ZONE 'UTC'
... få i henhold til UTCtimestamp
::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.