PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Contabilização de horário de verão no Postgres, ao selecionar itens agendados


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) ... montar timestamp [without time zone] Também poderia ser now()::date + t para "hoje".
  • AT WITH TIME ZONE tz ... coloque o timestamp no fuso horário salvo, resultando em timestamptz .
  • AT WITH TIME ZONE 'UTC' ... obter de acordo com UTC timestamp
  • ::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.