Usar timestamp with time zone (timestamptz ) para los cálculos.
Las horas de las alarmas pueden ser time [without time zone] .
Pero tienes que guardar la zona horaria explícitamente para cada fila.
Nunca usar time with time zone Es un tipo lógicamente roto, PostgreSQL desaconseja su uso. El manual:
Configuración de demostración:
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.
Tiene que ser la zona horaria nombres (no abreviaturas) para tener en cuenta el horario de verano. Relacionado:
Obtenga alarmas coincidentes para "hoy":
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)... ensamblartimestamp [without time zone]También podría ser simplementenow()::date + tpara "hoy".AT WITH TIME ZONE tz... coloque la marca de tiempo en la zona horaria guardada, lo que da como resultadotimestamptz.AT WITH TIME ZONE 'UTC'... obtener según UTCtimestamp::time... forma más sencilla de extraer el componente de tiempo.
Aquí puede buscar nombres de zonas horarias :
SELECT *
FROM pg_timezone_names
WHERE name ~~* '%sing%'
LIMIT 10
SQL Fiddle demostrando verano/invierno.