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)
... assemblatimestamp [without time zone]
Potrebbe anche essere solonow()::date + t
per "oggi".AT WITH TIME ZONE tz
... posiziona il timestamp nel fuso orario salvato, risultando intimestamptz
.AT WITH TIME ZONE 'UTC'
... ottieni iltimestamp
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.