[英]Insert time with timezone daylight savings
我想在包含時區並知道夏令時的 postgresql 中插入時間數據類型。 這就是我所做的:
CREATE TABLE mytable(
...
start_time time(0) with time zone,
end_time time(0) with time zone
)
INSERT INTO mytable(start_time, end_time)
VALUES(TIME '08:00:00 MST7MDT', TIME '18:00:00 MST7MDT')
我收到以下錯誤:
類型時間的無效輸入語法:“08:00:00 MST7MDT”
如果我使用“MST”而不是“MST7MDT”,它會起作用,但我需要它了解夏令時。 我也嘗試使用“美國/埃德蒙頓”作為時區,但我遇到了同樣的錯誤。
使用時區和 DST 插入時間值(不是時間戳)的正確方法是什么?
編輯:我實際上想使用“美國/埃德蒙頓”語法
正確的方法是根本不使用time with time zone
(注意time
和zone
之間的空間),因為它被設計破壞了。 它在 SQL 標准中,因此 Postgres 支持該類型 - 但建議不要使用它。 更多在這個相關的答案:
由於您遇到了DST問題, timetz
(簡稱)是一個特別糟糕的選擇。 處理夏令時的能力不足。 無法判斷8:00:00
是冬令時還是夏令時。
改用timestamp with time zone
( timstamptz
) 。 您可以隨時丟棄日期部分。 只需使用start_time::time
time 從timestamptz
獲取本地時間。 或使用AT TIME ZONE
轉換為您的時區。
通常,要自動考慮 DST ,請使用時區名稱而不是時區縮寫。 此相關問答中的更多解釋:
在您的特定情況下,您可能可以使用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;
關於時區處理的基礎知識:
這個怎么樣?
INSERT INTO mytable(start_time, end_time)
VALUES('08:00:00'::time at time zone 'MST7MDT', '18:00:00'::time at time zone 'MST7MDT')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.