繁体   English   中英

插入时区夏令时的时间

[英]Insert time with timezone daylight savings

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

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

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

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

改用timestamp with time zone ( timstamptz ) 您可以随时丢弃日期部分。 只需使用start_time::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;

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

这个怎么样?

INSERT INTO mytable(start_time, end_time)
VALUES('08:00:00'::time at time zone 'MST7MDT', '18:00:00'::time at time zone 'MST7MDT')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM