背景
PostgreSQL 可以使用IANA发布的时区数据库,但是由于IANA发布的数据库中,有些定义的时区别名并没有对应的时区。
从而导致PG在解析对应别名时会报错。
# select '2016-09-02 08:00:00 NOVST'::timestamptz;
ERROR: time zone abbreviation "novst" is not used in time zone "Asia/Novosibirsk"
查询pg_timezone_abbrevs函数返回所有的别名与时区对应关系,也会报错。
postgres=# select pg_timezone_abbrevs ();
ERROR: time zone abbreviation "novst" is not used in time zone "Asia/Novosibirsk"
修复BUG
在PostgreSQL的BUG报告中已经有在讨论这个问题
TOM LANE提供了一个patch,可以避免出现以上问题。
wget https://www.postgresql.org/message-id/attachment/45970/allow-timezone-abbrevs-not-matching-iana-data.patch
cd postgresql-9.5.4
patch -p1 < ../allow-timezone-abbrevs-not-matching-iana-data.patch
make -j 32
make install
重启数据库,测试,如果时区别名不存在时区映射关系时,使用了本地时区。
postgres=# select '2016-09-02 08:00:00 NOVST'::timestamptz;
timestamptz
------------------------
2016-09-02 09:00:00+08
(1 row)
长期来看,等PG的内核修复。