PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Specificare un fuso orario da utilizzare come fuso orario di riferimento

Devi salvare anche l'offset del fuso orario al timestamp .

Come già spiegato da @Milen (e collegato al manuale ):un timestamp salva solo un punto nel tempo (come valore astratto). Il modificatore di fuso orario è non salvato, serve solo per modificare il timestamp relativo a UTC .

Considera la seguente demo:

-- 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;

Eseguilo localmente per vedere. Presta particolare attenzione ai dettagli del AL FUSO ORARIO build e come estraggo il fuso orario dal (locale!) timestamp with time zone .
now() restituisce timestamp with time zone o timestamptz in breve.

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

timestamp_at_origin visualizza il timestamp con il fuso orario visto all'origine. Se ho capito la tua domanda, allora è quello che stai cercando.
Potresti migliorare ulteriormente la formattazione.

Potresti essere interessato a questa domanda correlata che fa luce sulle ambiguità e le insidie ​​dei fusi orari.