Я только что провел час в отчаянии с несоответствием в этих результатах этих двух выражений:
db=# SELECT '2012-01-18 1:0 CET'::timestamptz AT TIME ZONE 'UTC'
,'2012-01-18 1:0 Europe/Vienna'::timestamptz AT TIME ZONE 'UTC';
timezone | timezone
---------------------+---------------------
2012-08-18 00:00:00 | 2012-08-17 23:00:00
Очевидно, второе выражение вычитает два часа в соответствии с правилами DST, где первый использует только стандартное смещение.
Я проверил каталоги для этих двух названий часовых поясов. Они оба есть и выглядят одинаково:
db=# SELECT * FROM pg_timezone_names WHERE name IN ('CET', 'Europe/Vienna');
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Vienna | CEST | 02:00:00 | t
CET | CEST | 02:00:00 | t
Я посоветовался с руководством PostgreSQL о часовых поясах:
PostgreSQL позволяет указать часовые пояса в трех разных формах:
Полное имя часового пояса, например America/New_York. Признанные имена часовых поясов перечислены в представлении pg_timezone_names (см. раздел 45.67). PostgreSQL использует широко используемое время zoneinfo для этой цели, поэтому одни и те же имена также распознаются много другого программного обеспечения.
Сокращение часового пояса, например PST. Такая спецификация просто определяет конкретное смещение от UTC, в отличие от полного времени названия зон, которые могут означать набор переходных летних дней перехода на летнее время правила. Признанные сокращения перечислены в pg_timezone_abbrevs (см. раздел 45.66). Вы не можете установить параметры временной зоны или log_timezone в часовом поясе аббревиатура, но вы можете использовать сокращения в значениях ввода даты/времени и с оператором AT TIME ZONE.
Жирный Акцент Мой.
Так почему разница?
Моя настройка (добавлено больше деталей)
-
PostgreSQL 9.1.4 на Debian Squeeze (стандартные сжимание-backports из http://backports.debian.org/debian-backports)
-
Локальный
timezone
параметр по умолчанию относится к языку системыde_AT.UTF-8
, но для примера не имеет значения.
SELECT version();
version
-------------------------------------------------------------------------------------------------------
PostgreSQL 9.1.4 on x86_64-unknown-linux-gnu, compiled by gcc-4.4.real (Debian 4.4.5-8) 4.4.5, 64-bit
SHOW timezone_abbreviations;
timezone_abbreviations
------------------------
Default
.. который (я предполагаю) загружает аббревиатуры из этого файла: /usr/share/postgresql/ 9.1/timezonesets/Default
Я нахожусь в убытке, когда происходит название часового пояса CET
. Но, очевидно, это есть в моих установках. A быстрый тест на sqlfiddle показывает тот же результат.
Я тестировал на двух разных серверах с аналогичной настройкой. Также с PostgreSQL 8.4. Нашел "CET" как имя часового пояса в pg_timezone_names
во всех них.