Utiliser timestamp with time zone
(timestamptz
) pour les calculs.
Les heures des alarmes peuvent être time [without time zone]
.
Mais vous devez enregistrer le fuseau horaire explicitement pour chaque ligne.
Jamais utiliser time with time zone
C'est un type logiquement cassé, son utilisation est déconseillée par PostgreSQL. Le manuel :
Configuration de la démo :
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.
Il doit s'agir de noms de fuseau horaire (pas d'abréviations) pour tenir compte de l'heure d'été. Connexe :
Obtenir les alarmes correspondantes pour "aujourd'hui" :
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)
... assemblertimestamp [without time zone]
Peut aussi être simplementnow()::date + t
pour "aujourd'hui".AT WITH TIME ZONE tz
... place l'horodatage sur le fuseau horaire enregistré, ce qui donnetimestamptz
.AT WITH TIME ZONE 'UTC'
... obtenir selon UTCtimestamp
::time
... le moyen le plus simple d'extraire la composante temporelle.
Ici, vous pouvez rechercher les les noms de fuseaux horaires :
SELECT *
FROM pg_timezone_names
WHERE name ~~* '%sing%'
LIMIT 10
SQL Fiddle démonstration été / hiver.