Den rigtige måde er ikke at bruge time with time zone
(bemærk mellemrummet mellem time
og zone
) overhovedet, da det er brudt af design. Det er i SQL-standarden, så Postgres understøtter typen - men fraråder ikke at bruge det. Mere i dette relaterede svar:
Da du har problemer med DST
, timetz
(kort navn) er et særligt dårligt valg. Den er dårligt rustet til at håndtere sommertid. Det er umuligt at sige, om 8:00:00
er i vinter- eller sommertid.
Brug timestamp with time zone
(timstamptz
)
i stedet. Du kan altid kassere datodelen. Du skal blot bruge start_time::time
for at få den lokale tid fra en timestamptz
. Eller brug AT TIME ZONE
at transponere til din tidszone.
Generelt for at automatisk tage højde for sommertid , brug et tidszonenavn i stedet for en tidszoneforkortelse. Mere forklaring i dette relaterede spørgsmål og svar:
- Tidszonenavne med identiske egenskaber giver forskellige resultater, når de anvendes på tidsstemplet
I dit særlige tilfælde kunne du sandsynligvis bruge America/Los_Angeles
(eksempel med 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')
Jeg fandt dette ved at tjekke:
SELECT * FROM pg_timezone_names
WHERE utc_offset = '-07:00'
AND is_dst;
Grundlæggende om tidszonehåndtering: