ฉันตอบคำถาม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