我在回答这个stackoverflow问题,发现奇怪的结果:
select * from pg_timezone_names where name = 'Europe/Berlin' ;
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CET | 01:00:00 | f
和下一个查询
select id,
timestampwithtimezone,
timestampwithtimezone at time zone 'Europe/Berlin' as berlin,
timestampwithtimezone at time zone 'CET' as cet
from data ;
id | timestampwithtimezone | berlin | cet
-----+------------------------+---------------------+---------------------
205 | 2012-10-28 01:30:00+02 | 2012-10-28 01:30:00 | 2012-10-28 00:30:00
204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 | 2012-10-28 01:00:00
203 | 2012-10-28 02:30:00+02 | 2012-10-28 02:30:00 | 2012-10-28 01:30:00
202 | 2012-10-28 02:59:59+02 | 2012-10-28 02:59:59 | 2012-10-28 01:59:59
106 | 2012-10-28 02:00:00+01 | 2012-10-28 02:00:00 | 2012-10-28 02:00:00
我正在使用PostgreSQL 9.1.2和ubuntu 12.04。
刚刚检查了8.2.11的结果是否相同。
根据文档,我使用名称还是缩写都没有关系。
这是一个错误吗?
难道我做错了什么?
有人可以解释这个结果吗?
编辑 对于CET不是欧洲/柏林的评论。
我只是从pg_timezone_names中选择值。
select * from pg_timezone_names where abbrev ='CEST';
name | abbrev | utc_offset | is_dst
------+--------+------------+--------
和
select * from pg_timezone_names where abbrev ='CET';
name | abbrev | utc_offset | is_dst
---------------------+--------+------------+--------
Africa/Tunis | CET | 01:00:00 | f
Africa/Algiers | CET | 01:00:00 | f
Africa/Ceuta | CET | 01:00:00 | f
CET | CET | 01:00:00 | f
Atlantic/Jan_Mayen | CET | 01:00:00 | f
Arctic/Longyearbyen | CET | 01:00:00 | f
Poland | CET | 01:00:00 | f
.....
在冬季,欧洲/柏林为+01。夏季为+02。
EDIT2
在2012-10-28时区从夏令时更改为冬季时间2:00。
这两个记录在欧洲/柏林具有相同的价值:
204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 | 2012-10-28 01:00:00
106 | 2012-10-28 02:00:00+01 | 2012-10-28 02:00:00 | 2012-10-28 02:00:00
这表明如果我对大数据范围(夏季时间和冬季时间)使用缩写(CET或CEST)之一,则对于某些记录而言,结果将是错误的。如果我使用“欧洲/柏林”,将会很好。
我将系统时间更改为“ 2012-01-17”,并且pg_timezone_names也已更改。
select * from pg_timezone_names where name ='Europe/Berlin';
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CEST | 02:00:00 | t
CET
是没有 Europe/Berlin
-至少在DST次不行。
2012-10-28 01:30:00
是CEST,而不是CET。