Използвайте timestamp with time zone
(timestamptz
) за изчисления.
Часовете за аларми могат да бъдат time [without time zone]
.
Но трябва да запазите часовата зона изрично за всеки ред.
Никога използвайте time with time zone
Това е логически счупен тип, използването му не се препоръчва от PostgreSQL. Ръководството:
Демо настройка:
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.
Трябва да са имена на часовата зона (не съкращения) за отчитане на лятното часово време. Свързани:
Вземете съответстващи аларми за "днес":
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]
Може също да бъде простоnow()::date + t
за "днес".AT WITH TIME ZONE tz
... поставете клеймо за време в запазената часова зона, което води доtimestamptz
.AT WITH TIME ZONE 'UTC'
... вземете според UTCtimestamp
::time
... най-лесният начин за извличане на времевия компонент.
Тук можете да търсите имена на часови зони :
SELECT *
FROM pg_timezone_names
WHERE name ~~* '%sing%'
LIMIT 10
SQL Fiddle демонстриране на лято/зима.