sql >> Base de Datos >  >> RDS >> PostgreSQL

Contabilización del horario de verano en Postgres, al seleccionar elementos programados

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) ... ensamblar timestamp [without time zone] También podría ser simplemente now()::date + t para "hoy".
  • AT WITH TIME ZONE tz ... coloque la marca de tiempo en la zona horaria guardada, lo que da como resultado timestamptz .
  • AT WITH TIME ZONE 'UTC' ... obtener según UTC timestamp
  • ::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.