PostgreSQL神秘主义与时间戳字段

时间:2013-12-17 00:25:13

标签: postgresql gentoo

我有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使用相同的标志编译安装在另一台机器上工作漂亮!很奇怪。

1 个答案:

答案 0 :(得分:2)

这是正常行为,PostgreSQL在输出带时区的时间戳(内部确实存储为UTC)时会尝试容纳用户。我假设你在英国,你看到的是它在夏季和冬季之间的变化。从手册中,强调增加了:

  

对于带时区的时间戳,内部存储的值始终为   UTC(通用协调时间,传统上称为格林威治标准   时间,GMT)。具有指定显式时区的输入值是   使用该时区的适当偏移量转换为UTC。如果   在输入字符串中没有声明时区,则假定它是   在系统的时区参数指示的时区中,是   使用时区的偏移量转换为UTC。

     

当输出带有时区值的时间戳时, 始终是   从UTC转换为当前时区,并显示为   该区域的当地时间。 要查看其他时区的时间,也可以   更改时区或使用AT TIME ZONE构造(参见第9.9.3节)。