Tôi đã trả lời câu hỏi stackoverflow này và thấy kết quả lạ:
select * from pg_timezone_names where name = 'Europe/Berlin' ;
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CET | 01:00:00 | f
và truy vấn tiếp theo
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
Tôi đang sử dụng PostgreSQL 9.1.2 và ubfox 12.04.
Chỉ cần kiểm tra rằng kết quả vào ngày 8.2.11 là như nhau.
Theo tài liệu thì không vấn đề gì nếu tôi sử dụng tên hoặc viết tắt.
Đây có phải là một lỗi?
Tôi có làm điều gì sai?
Ai đó có thể giải thích kết quả này?
EDIT Cho nhận xét rằng CET không phải là Châu Âu / Berlin.
Tôi chỉ chọn các giá trị từ pg_timezone_names.
select * from pg_timezone_names where abbrev ='CEST';
name | abbrev | utc_offset | is_dst
------+--------+------------+--------
và
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
.....
Trong mùa đông Châu Âu / Berlin là +01. Trong mùa hè, nó là +02.
EDIT2
Trong múi giờ 2012-10-28 đã thay đổi từ thời điểm mùa hè sang thời gian mùa đông lúc 2:00.
Hai hồ sơ này có cùng giá trị ở Châu Âu / Berlin:
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
Điều này cho thấy rằng nếu tôi sử dụng một trong những chữ viết tắt (CET hoặc CEST) cho phạm vi dữ liệu lớn (thời gian mùa hè và thời gian mùa đông) sẽ là sai đối với một số hồ sơ. Sẽ tốt nếu tôi sử dụng 'Châu Âu / Berlin'.
Tôi đã thay đổi thời gian hệ thống thành '2012-01-17' và pg_timezone_names cũng thay đổi.
select * from pg_timezone_names where name ='Europe/Berlin';
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CEST | 02:00:00 | t
CET
là không Europe/Berlin
- ít nhất là trong thời gian DST.
2012-10-28 01:30:00
là CEST, không phải CET.