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.