关于sql:插入时区夏令时

Insert time with timezone daylight savings

我想在PostgreSQL中插入时间数据类型,它包括时区,并且知道夏令时。这就是我所做的:

1
2
3
4
5
6
7
8
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')

我得到以下错误:

invalid input syntax for type time:"08:00:00 MST7MDT"

如果我使用"mst"而不是"mst7mdt",它是有效的,但我需要它知道dst。我也试着用"美国/埃德蒙顿"作为时区,但我也犯了同样的错误。

使用时区和DST插入时间值(不是时间戳)的正确方法是什么?

编辑:我实际上想使用"America/Edmonton"语法


正确的方法是根本不使用time with time zone(注意timezone之间的空间),因为它被设计破坏了。它在SQL标准中,因此Postgres支持该类型,但建议不要使用它。更多相关答案:当选择计划项目时,在Postgres中计算DST

由于DST存在问题,因此EDOCX1(简称3)是一个特别糟糕的选择。它不具备处理DST的能力。不可能分辨江户十一〔四〕是在冬夏季节。

使用timestamp with time zone(timstamptz)。您总是可以放弃日期部分。只需使用start_time::timetimestamptz获取本地时间。或者使用AT TIME ZONE转换到你的时区。

通常,要自动考虑DST,请使用时区名称而不是时区缩写。有关此问题和答案的更多说明:具有相同属性的时区名称在应用于时间戳时产生不同的结果

在您的特定情况下,您可能会使用America/Los_Angeles(例如,timestamptz):

1
2
3
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')

我通过检查发现:

1
2
3
SELECT * FROM pg_timezone_names
WHERE  utc_offset = '-07:00'
AND    is_dst;

时区处理的基础知识:在Rails和PostgreSQL中完全忽略时区