Я відповідав на це запитання про 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 результат такий же.
Згідно з документацією, не має значення, чи використовую я ім’я або абревіатуру.
Це помилка?
Я щось роблю не так?
Чи може хтось пояснити цей результат?
EDIT Для коментаря, що CET не є Європою / Берліном.
Я просто вибираю значення з імен pg_timezone_name.
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.