小编典典

插入时间与时区夏令时

sql

我想在包括时区的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。我也尝试使用’America /
Edmonton’作为时区,但是我遇到了同样的错误。

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

编辑:我实际上想使用“美国/埃德蒙顿”语法


阅读 187

收藏
2021-05-16

共1个答案

小编典典

正确的 方法是不使用time with timezone(注意之间的空间time,并zone在所有),因为它是由设计打破。它在SQL标准中,因此Postgres支持该类型-但建议 不要
使用它。

由于您在使用DST时遇到问题,timetz(短名称)是一个特别糟糕的选择。它没有足够的能力来处理DST。分辨8:00:00是冬季还是夏季是不可能的。

使用timestamp with timezonetimstamptz代替。您可以随时丢弃日期部分。只需使用start_time::time来获取 本地
从时间timestamptz。或用于AT TIMEZONE移调到您的时区。

通常,要 自动考虑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中完全忽略时区

2021-05-16