PostgreSQL now()和夏令时

PostgreSQL now()和夏令时,postgresql,dst,Postgresql,Dst,我们在PostgreSQL 9.0.10中遇到了夏令时问题。在尝试使用OS时区文件结构时,我们将PostgreSQL的文件替换为指向OS时区文件的链接(并重命名原始文件) $ls-l/usr/local/pgsql/share/timezone/Brazil /usr/local/pgsql/share/timezone/Brazil->/usr/share/zoneinfo/Brazil/ 查询数据库时,一切正常: => SELECT * FROM pg_timezone_names

我们在PostgreSQL 9.0.10中遇到了夏令时问题。在尝试使用OS时区文件结构时,我们将PostgreSQL的文件替换为指向OS时区文件的链接(并重命名原始文件)

$ls-l/usr/local/pgsql/share/timezone/Brazil
/usr/local/pgsql/share/timezone/Brazil->/usr/share/zoneinfo/Brazil/
查询数据库时,一切正常:

=> SELECT * FROM pg_timezone_names where name like '%Brazil%';
           name            | abbrev | utc_offset | is_dst
---------------------------+--------+------------+--------
 Brazil.original/DeNoronha | FNT    | -02:00:00  | f
 Brazil.original/East      | BRST   | -02:00:00  | t
 Brazil.original/West      | AMT    | -04:00:00  | f
 Brazil.original/Acre      | AMT    | -04:00:00  | f
 Brazil/DeNoronha          | -02    | -02:00:00  | f
 Brazil/East               | BRT    | -03:00:00  | f
 Brazil/West               | -04    | -04:00:00  | f
 Brazil/Acre               | -05    | -05:00:00  | f

=> show timezone;
  TimeZone
-------------
Brazil/East
如上所示,“巴西/东部”为-03,DST为假。但我们得到的是:

=> select now(), now() AT TIME ZONE 'Brazil/East';
              now              |          timezone
-------------------------------+----------------------------
2018-10-21 11:25:51.300744-02 | 2018-10-21 11:25:51.300744
我们希望看到的是“2018-10-21 10:25:51.300744-03”,而不是这个日期 "-02".


关于我们这里缺少的内容有什么想法吗?

在PostgreSQL安装中替换文件不是正确且受支持的处理方法,因此得到奇怪的结果也就不足为奇了

您应该重新生成PostgreSQL,并使用
——和系统tzdata
对其进行配置,如中所述


但是当然你不应该使用9.0版,它已经失去支持大约3年了。

如果你使用的是不受支持的Postgres版本,那么你为什么不至少使用最新的次要版本9.0.23呢?由于每个次要版本都会附带最新的TZ文件,可能2015年的版本已经包含了您想要的补丁(9.0.10是在2012年发布的,所以间隔三年)。我们有一个无法进行此升级的场景。DST日期的更改仅在2周前由巴西政府完成:“对于小版本,社区认为不升级比升级风险更大”您当前的版本缺少3年的错误修复-其中一些甚至可能导致数据损坏(但确实无法解决您的DST问题)是的。无论如何,谢谢你的建议。:)我们有一个无法升级的场景。那么,显然数据对您来说不是很重要。在这种情况下,您不必担心升级。到目前为止,这并不是我们无法升级的原因。但无论如何,谢谢你抽出时间!我的意思是,即使你不想升级,如果你想使用不同的时区文件,你也应该重建PostgreSQL。