Seh*_*ael 0 sql postgresql timezone datetime dst
我想在 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')
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
时间类型的输入语法无效:“08:00:00 MST7MDT”
如果我使用“MST”而不是“MST7MDT”,它就可以工作,但我需要它了解夏令时。我还尝试使用“美国/埃德蒙顿”作为时区,但出现了同样的错误。
插入带有时区和 DST 的时间值(不是时间戳)的正确方法是什么?
编辑:我实际上想使用“美国/埃德蒙顿”语法
正确的方法是根本不使用(注意和time with time zone之间的空格),因为它被设计破坏了。它位于 SQL 标准中,因此 Postgres 支持该类型 - 但建议不要使用它。更多相关答案:timezone
由于您在DST方面遇到问题,timetz(简称)是一个特别糟糕的选择。它没有能力应对夏令时。无法判断是8:00:00冬天还是夏天。
使用timestamp with time zone( timstamptz)代替。您始终可以丢弃日期部分。只需使用即可从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')
Run Code Online (Sandbox Code Playgroud)
我通过检查发现了这一点:
SELECT * FROM pg_timezone_names
WHERE utc_offset = '-07:00'
AND is_dst;
Run Code Online (Sandbox Code Playgroud)
有关时区处理的基础知识:
| 归档时间: |
|
| 查看次数: |
3848 次 |
| 最近记录: |