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