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

Spécifiez un fuseau horaire à utiliser comme fuseau horaire de référence

Vous devez enregistrer le décalage horaire en plus à l'timestamp .

Comme @Milen l'a déjà expliqué (et lié au manuel ) :un timestamp enregistre uniquement un point dans le temps (en tant que valeur abstraite). Le modificateur de fuseau horaire n'est pas enregistré, il ne sert qu'à ajuster le timestamp par rapport à UTC .

Considérez la démo suivante :

-- DROP TABLE tbl;
CREATE TEMP TABLE tbl (id int, myts timestamptz, mytz interval);

INSERT INTO tbl VALUES
 (1, now()                , EXTRACT (timezone from now()) * interval '1s')
,(2, '2012-01-01 00:00-05', interval '-5h')
,(3, '2012-01-01 00:00+04', interval '4h')
,(4, '2012-11-11 20:30+03', interval '3h');

SELECT *
      ,(myts AT TIME ZONE mytz)::text
       || CASE WHEN mytz > '0:0' THEN '+' ELSE '' END
       || to_char(mytz, 'FMHH24:mi') AS timestamp_at_origin
FROM tbl;

Exécutez-le localement pour voir. Portez une attention particulière aux détails du AU FUSEAU HORAIRE construction, et comment j'extrait le fuseau horaire du (local !) timestamp with time zone .
now() renvoie timestamp with time zone ou timestamptz pour faire court.

EXTRACT (timezone from now()) * interval '1s'

timestamp_at_origin affiche l'horodatage avec le fuseau horaire tel qu'il apparaît à son origine. Si j'ai bien compris votre question, alors c'est ce que vous recherchez.
Vous pourriez encore améliorer la mise en forme.

Vous pourriez être intéressé par cette question connexe qui met en lumière les ambiguïtés et les pièges des fuseaux horaires.