Il corretto modo è non usare time with time zone
(nota lo spazio tra time
e zone
) affatto, poiché è rotto dalla progettazione. È nello standard SQL, quindi Postgres supporta il tipo, ma consiglia non per usarlo. Altro in questa risposta correlata:
Poiché hai problemi con DST
, timetz
(nome breve) è una scelta particolarmente pessima. Non è attrezzato per gestire l'ora legale. È impossibile dire se 8:00:00
è in inverno o in estate.
Usa timestamp with time zone
(timstamptz
)
invece. Puoi sempre scartare la parte della data. Usa semplicemente start_time::time
per ottenere il locale tempo da un timestamptz
. Oppure usa AT TIME ZONE
da trasporre al tuo fuso orario.
In genere, per prendere automaticamente in considerazione l'ora legale , utilizza un nome del fuso orario invece di un'abbreviazione di fuso orario. Maggiori spiegazioni in questa domanda e risposta correlata:
Nel tuo caso particolare, potresti probabilmente usare America/Los_Angeles
(esempio con 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')
L'ho trovato controllando:
SELECT * FROM pg_timezone_names
WHERE utc_offset = '-07:00'
AND is_dst;
Nozioni di base sulla gestione del fuso orario: