我有timestamp with time zone
的PostgreSQL数据库表
名为published_date
的字段。
我使用psql -U postgres dbname
命令访问我的数据库。
当我尝试通过命令更新published_date字段值时:
UPDATE mytable SET published_date='PUBLISHED_DATE' WHERE id=3;
我得到以下相应PUBLISHED_DATE的结果:
SOURCE -> RESULT
2013-01-16 20:00:00 -> 2013-01-16 20:00:00+00 (WELL)
2013-02-16 20:00:00 -> 2013-02-16 20:00:00+00 (WELL)
2013-03-16 20:00:00 -> 2013-03-16 20:00:00+00 (WELL)
2013-04-16 20:00:00 -> 2013-04-16 20:00:00+01 (STRANGE!)
2013-05-16 20:00:00 -> 2013-05-16 20:00:00+01 (STRANGE!)
2013-06-16 20:00:00 -> 2013-06-16 20:00:00+01 (STRANGE!)
2013-07-16 20:00:00 -> 2013-07-16 20:00:00+01 (STRANGE!)
2013-08-16 20:00:00 -> 2013-08-16 20:00:00+01 (STRANGE!)
2013-09-16 20:00:00 -> 2013-09-16 20:00:00+01 (STRANGE!)
2013-10-16 20:00:00 -> 2013-10-16 20:00:00+01 (STRANGE!)
2013-11-16 20:00:00 -> 2013-11-16 20:00:00+00 (WELL)
2013-12-16 20:00:00 -> 2013-12-16 20:00:00+00 (WELL)
数据库中有UTC时区:
=> SHOW timezone;
TimeZone
----------
UTC
(1 row)
和系统:
$ date
Tue Dec 17 00:14:12 GMT 2013
PostgreSQL版本是9.2.4
相同版本的postgres使用相同的标志编译安装在另一台机器上工作漂亮!很奇怪。
答案 0 :(得分:2)
这是正常行为,PostgreSQL在输出带时区的时间戳(内部确实存储为UTC)时会尝试容纳用户。我假设你在英国,你看到的是它在夏季和冬季之间的变化。从手册中,强调增加了:
对于带时区的时间戳,内部存储的值始终为 UTC(通用协调时间,传统上称为格林威治标准 时间,GMT)。具有指定显式时区的输入值是 使用该时区的适当偏移量转换为UTC。如果 在输入字符串中没有声明时区,则假定它是 在系统的时区参数指示的时区中,是 使用时区的偏移量转换为UTC。
当输出带有时区值的时间戳时, 始终是 从UTC转换为当前时区,并显示为 该区域的当地时间。 要查看其他时区的时间,也可以 更改时区或使用AT TIME ZONE构造(参见第9.9.3节)。