PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comptabilisation de l'heure d'été dans Postgres, lors de la sélection d'éléments planifiés

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) ... assembler timestamp [without time zone] Peut aussi être simplement now()::date + t pour "aujourd'hui".
  • AT WITH TIME ZONE tz ... place l'horodatage sur le fuseau horaire enregistré, ce qui donne timestamptz .
  • AT WITH TIME ZONE 'UTC' ... obtenir selon UTC timestamp
  • ::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.