Use
timestamp with time zone (timestamptz ) para cálculos.Os horários dos alarmes podem ser
time [without time zone] .Mas você precisa salvar o fuso horário explicitamente para cada linha.
Nunca use
time with time zone É um tipo logicamente quebrado, seu uso é desencorajado pelo PostgreSQL. O manual:
Configuração de demonstração:
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.
Tem que ser nomes de fuso horário (não abreviações) para contabilizar o horário de verão. Relacionado:
Obtenha alarmes correspondentes para "hoje":
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)... montartimestamp [without time zone]Também poderia sernow()::date + tpara "hoje".AT WITH TIME ZONE tz... coloque o timestamp no fuso horário salvo, resultando emtimestamptz.AT WITH TIME ZONE 'UTC'... obter de acordo com UTCtimestamp::time... maneira mais simples de extrair o componente de tempo.
Aqui você pode procurar nomes de fuso horário :
SELECT *
FROM pg_timezone_names
WHERE name ~~* '%sing%'
LIMIT 10
SQL Fiddle demonstrando verão/inverno.