0

我想在包含时区并知道夏令时的 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 插入时间值(不是时间戳)的正确方法是什么?

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

4

2 回答 2

5

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

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

请改用timestamp with time zone( timstamptz)。您可以随时丢弃日期部分。只需使用. start_time::time_ 或用于转置到您的时区。timestamptzAT 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;

关于时区处理的基础知识:

于 2013-10-29T04:26:57.397 回答
0

这个怎么样?

INSERT INTO mytable(start_time, end_time)
VALUES('08:00:00'::time at time zone 'MST7MDT', '18:00:00'::time at time zone 'MST7MDT')
于 2021-06-17T07:25:46.913 回答