Правилнотото начинът е да не използвате time with time zone
(обърнете внимание на интервала между time
и zone
) изобщо, тъй като е счупен по дизайн. Той е в стандарта SQL, така че Postgres поддържа типа - но препоръчва не да го използвате. Повече в този свързан отговор:
Тъй като имате проблеми с DST
, timetz
(кратко име) е особено лош избор. Той е зле оборудван за работа с DST. Невъзможно е да се каже дали 8:00:00
е зимно или лятно време.
Използвайте timestamp with time zone
(timstamptz
)
вместо. Винаги можете да отхвърлите частта с датата. Просто използвайте start_time::time
за да получите локалното време от timestamptz
. Или използвайте AT TIME ZONE
за транспониране във вашата часова зона.
Като цяло, за автоматично отчитане на лятното часово време , използвайте име на часовата зона вместо съкращение на часовата зона. Повече обяснения в този свързан въпрос и отговор:
Във вашия конкретен случай вероятно бихте могли да използвате America/Los_Angeles
(пример с 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')
Намерих това, като проверих:
SELECT * FROM pg_timezone_names
WHERE utc_offset = '-07:00'
AND is_dst;
Основи за обработката на часовата зона: