PostgreSql:得到奇怪的“带时区的时间戳”

时间:2013-05-15 18:27:58

标签: database postgresql datetime formatting timestamp

我插入表格中的字段类型为“timestamp with time zone”string“1858-11-17 01:09:05 + 0000”并且返回strage格式化值“05:11:29 + 04:02: 24" 。

这是会话

test=> create table ddtbl (val timestamp with time zone);
CREATE TABLE
test=> insert into ddtbl (val) values ('1858-11-17 01:09:05+0000');
INSERT 0 1
test=> select * from ddtbl;
             val              
------------------------------
 1858-11-17 05:11:29+04:02:24

为什么会发生这种情况,这里的“+04:02:24”是什么?

UPD:PostgreSQL版

% psql --version
psql (PostgreSQL) 9.2.4

UPD2:当地时区

% date +%Z
YEKT
% date +%z
+0600

2 个答案:

答案 0 :(得分:2)

这是时区的效果。在20世纪初之前,许多国家(如德国或俄罗斯)拥有完全不同的制度,例如“太阳能时间”和“太阳能时间”。这不会干净地转换为UTC。

因此,时区0(当时的GMT,因为还没有UTC)的时间将表示为叶卡捷琳堡(俄罗斯)的当地时间的奇数时间偏移。

+04:02:24是与UTC相比的实际偏移量。

答案 1 :(得分:-1)

它解释您的输入值是UTC。

psql=# select cast('1858-11-17 01:09:05 UTC' as timestamp with time zone);
      timestamptz       
------------------------
 1858-11-17 01:09:05+00
(1 row)


psql=# select cast('1858-11-17 01:09:05 BRT' as timestamp with time zone);
      timestamptz       
------------------------
 1858-11-17 04:09:05+00
(1 row)

这两个值只是同一时间戳的不同表示。

psql=# select cast('1858-11-17 05:11:29+04:02:24' as timestamp with time zone) = cast('1858-11-17 01:09:05+0000' as timestamp with time zone);
 ?column? 
----------
 t
(1 row)