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

Insérer l'heure avec l'heure d'été du fuseau horaire

Le propre le moyen n'est pas d'utiliser time with time zone (notez l'espace entre time et zone ) du tout, car il est cassé par conception. C'est dans le standard SQL, donc Postgres prend en charge le type - mais conseille pas pour l'utiliser. Plus dans cette réponse connexe :

Puisque vous rencontrez des problèmes avec DST , timetz (nom abrégé) est un choix particulièrement mauvais. Il est mal équipé pour faire face à l'heure d'été. Il est impossible de dire si 8:00:00 est en heure d'hiver ou d'été.

Utilisez timestamp with time zone (timstamptz ) Au lieu. Vous pouvez toujours supprimer la partie date. Utilisez simplement start_time::time pour obtenir le local heure à partir d'un timestamptz . Ou utilisez AT TIME ZONE à transposer dans votre fuseau horaire.

Généralement, pour prendre en compte automatiquement l'heure d'été , utilisez un nom de fuseau horaire au lieu d'une abréviation de fuseau horaire. Plus d'explications dans cette question et réponse :

Dans votre cas particulier, vous pourriez probablement utiliser America/Los_Angeles (exemple avec timestamptz ):

INSERT INTO mytable(start_time, end_time)
VALUES
   ('1970-01-01 08:00:00 America/Los_Angeles'
  , '1970-01-01 18:00:00 America/Los_Angeles')

J'ai trouvé ceci en vérifiant :

SELECT * FROM pg_timezone_names 
WHERE  utc_offset = '-07:00'
AND    is_dst;

Notions de base sur la gestion des fuseaux horaires :