PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Contabilità dell'ora legale in Postgres, quando si selezionano gli articoli programmati

Usa timestamp with time zone (timestamptz ) per i calcoli.
Gli orari degli allarmi possono essere time [without time zone] .
Ma devi salvare il fuso orario esplicitamente per ogni riga.

Mai usa time with time zone È un tipo logicamente rotto, il suo utilizzo è sconsigliato da PostgreSQL. Il manuale:

Configurazione demo:

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.

Deve essere il fuso orario nomi (non abbreviazioni) per tenere conto dell'ora legale. Correlati:

Ricevi sveglie corrispondenti per "oggi":

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) ... assembla timestamp [without time zone] Potrebbe anche essere solo now()::date + t per "oggi".
  • AT WITH TIME ZONE tz ... posiziona il timestamp nel fuso orario salvato, risultando in timestamptz .
  • AT WITH TIME ZONE 'UTC' ... ottieni il timestamp secondo UTC
  • ::time ... il modo più semplice per estrarre la componente temporale.

Qui puoi cercare nomi dei fusi orari :

SELECT *
FROM   pg_timezone_names
WHERE  name ~~* '%sing%'
LIMIT  10

SQL Fiddle dimostrando estate/inverno.