使用时区夏令时插入时间



我想在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(注意timezone之间的空格),因为它在设计上被破坏了。它在SQL标准中,所以Postgres支持该类型 - 但建议不要使用它。更多相关答案:

  • 选择计划项目时在 Postgres 中核算 DST

由于您在使用 DST 时遇到问题,因此timetz(短名称)是一个特别糟糕的选择。它没有能力处理 DST。无法判断8:00:00是在冬季还是夏季。

请改用timestamp with time zonetimstamptz )。您始终可以丢弃日期部分。只需使用 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')

相关内容

  • 没有找到相关文章

最新更新