Isl*_*gre 5 postgresql timezone timestamp-with-timezone postgresql-9.6
我在我的中找到了以下行postgresql.conf:
timezone = 'CET'
Run Code Online (Sandbox Code Playgroud)
我也通过查询设置得到了这个:
postgres=# show timezone;
TimeZone
----------
CET
Run Code Online (Sandbox Code Playgroud)
无论如何,我们目前仍然有 DST 活动,下面的示例显示服务器知道这一点(+02 是 CEST):
postgres=# select now();
now
-------------------------------
2019-10-09 02:03:33.48477+02
Run Code Online (Sandbox Code Playgroud)
但也有 PostgreSQL 已知的时区,缩写为 DST CET,并且没有 DST。特别是,所有具有此缩写的时区都有偏移+01:
postgres=# select * from pg_timezone_names() where abbrev = 'CET';
name | abbrev | utc_offset | is_dst
----------------+--------+------------+--------
Africa/Algiers | CET | 01:00:00 | f
Africa/Tunis | CET | 01:00:00 | f
postgres=# select * from pg_timezone_abbrevs where abbrev = 'CET';
abbrev | utc_offset | is_dst
--------+------------+--------
CET | 01:00:00 | f
Run Code Online (Sandbox Code Playgroud)
我现在对此以及这个缩写和设置的含义感到困惑TimeZone。我预计,每个timestamp with time zone都会显示在此参数设置的时区中。但显然,这并不成立:
postgres=# select now(), now() AT TIME ZONE (SELECT setting FROM pg_settings WHERE name = 'TimeZone');
now | timezone
------------------------------+---------------------------
2019-10-09 02:03:33.48477+02 | 2019-10-09 01:03:33.48477
Run Code Online (Sandbox Code Playgroud)
最后,这是我的问题:
这到底是如何运作的?是否有任何设置指定使用某些 DST 规则?我得到的输出是我对Europe/Berlin具有 DST 规则的时区的预期。但是,如果我需要我的数据库在真正的 CET 中运行(因此没有任何 DST)怎么办?或者是否有另一个我没有看到的配置,它会覆盖TimeZone?
我也想知道如何AT TIME ZONE运作。在文档中,我发现了以下内容:
在显示给客户端之前,它们会转换为 TimeZone 配置参数指定的区域中的本地时间。
但正如我的查询所示,这并不真正适用。在同一页上还有以下声明,似乎也不适用(也是log_timezone)CET:
您无法将配置参数 TimeZone 或 log_timezone 设置为时区缩写,但可以在日期/时间输入值中以及与 AT TIME ZONE 运算符一起使用缩写。
我混淆了什么吗?或者他们有一些已知的错误(并且它们可能在新版本中修复)?这些文档是错误的吗?
我的 PostgreSQLversion()是PostgreSQL 9.6.5, compiled by Visual C++ build 1800, 64-bit.
(免责声明:我对它正在做的事情有点高兴,至少除了“问题”之外AT TIME ZONE,因为我在德国并且我们有夏令时。但我不明白为什么CET默认使用夏令时,我想知道是否有一个参数来关闭/配置它。而且我觉得规范AT TIME ZONE或默认行为分别有问题。)
| 归档时间: |
|
| 查看次数: |
1987 次 |
| 最近记录: |