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 + t
para "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.