2013-10-29 84 views
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') 

我收到以下错误:

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

它的工作原理,如果我使用“MST”,而不是“MST7MDT”,但我需要它来了解DST的。我也尝试使用'America/Edmonton'作为时区,但我得到了同样的错误。

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

编辑: 我真的想用“美国/埃德蒙顿语法

+0

嗨检查此答案已经有人发布了关于它的问题http://stackoverflow.com/a/11148548/2478386 我希望这会帮助你。 –

回答

3

适当的方法是不使用time with time zone在所有(注意timezone之间的空间),因为它被设计破坏了。它在SQL标准中,所以Postgres支持这种类型 - 但建议使用而不是。更多在这个相关答案:
Accounting for DST in Postgres, when selecting scheduled items

既然您有DSTtimetz(简称)的问题是一个特别坏的选择。它没有处理DST的能力。无法判断8:00:00是冬季还是夏季。

改为使用timestamp with time zone (timstamptz)。您始终可以放弃日期部分。只需使用start_time::time即可从timestamptz获得本地时间。或使用AT TIME ZONE转置到您的时区。

一般来说,为了采取DST考虑自动,使用时区名称,而不是一个时区的缩写。在此相关的问题&回答更多的解释:
Time zone names with identical properties yield different result when applied to timestamp

在您的特定情况下,你很可能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; 

关于时区处理的基本知识:
Ignoring timezones altogether in Rails and PostgreSQL