我想在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。我也尝试使用"美国/埃德蒙顿"作为时区,但我得到了同样的错误。
插入带有时区和 DST 的时间值(不是时间戳)的正确方法是什么?
编辑:我实际上想使用"美国/埃德蒙顿"语法
正确的
方法是根本不使用time with time zone
(注意time
和zone
之间的空格),因为它在设计上被破坏了。它在SQL标准中,所以Postgres支持该类型 - 但建议不要使用它。更多相关答案:
- 在
- 选择计划项目时在 Postgres 中核算 DST
由于您在使用 DST 时遇到问题,因此timetz
(短名称)是一个特别糟糕的选择。它没有能力处理 DST。无法判断8:00:00
是在冬季还是夏季。
请改用timestamp with time zone
( timstamptz
)。您始终可以丢弃日期部分。只需使用 start_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;
有关时区处理的基础知识:
- 在 Rails 和 PostgreSQL 中完全忽略时区
这个怎么样?
INSERT INTO mytable(start_time, end_time)
VALUES('08:00:00'::time at time zone 'MST7MDT', '18:00:00'::time at time zone 'MST7MDT')