簡體   English   中英

插入時區夏令時的時間

[英]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 (注意timezone之間的空間),因為它被設計破壞了。 它在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM