PostgreSQL 9.6中文本datetime转timestamptz结果不一致原因
PostgreSQL文本转timestamptz时区偏移差异原因
这个差异是你配置的W-SU时区的历史夏令时规则导致的,和datestyle、lc_time配置以及PostgreSQL 9.6版本无关,具体逻辑如下:
- 你设置的
timezone = 'W-SU'是原苏联西部时区(即莫斯科时区)的别名,该时区存在多次夏令时规则变更:2014年10月26日之前,俄罗斯实行冬令时+03、夏令时+04的年度切换规则,2014年之后正式取消夏令时,全年固定为+03时区偏移。 - PostgreSQL将无时区信息的文本时间转换为
timestamptz类型时,会自动匹配数据库配置时区的历史规则,计算该时间点对应的实际偏移:如果你的两个转换日期分别落在夏令时生效时段和冬令时生效时段,最终得到的偏移自然会出现+03和+04的区别。
示例验证:转换
'2014-06-01 12:00:00'(夏令时生效期)会得到2014-06-01 12:00:00+04,转换'2014-11-01 12:00:00'(冬令时生效期)会得到2014-11-01 12:00:00+03,和你遇到的现象完全一致。
如果需要固定时区偏移,不需要匹配历史规则,可以手动指定转换时区,写法参考:SELECT TO_TIMESTAMP('你的时间文本', 'YYYY-MM-DD HH24:MI:SS') AT TIME ZONE 'UTC+3';
内容的提问来源于stack exchange,提问作者Alexey Chuhrov
相关产品推荐
相关产品推荐

