2013-05-15 70 views
4

我将与字段类型表“时间戳和时区”串“1858年11月17日01:09:05 + 0000”并取回strage格式化价值“05:11:29 + 04:02:24”。PostgreSQL的:获得奇怪的格式化“时间戳和时区”

这里是会议

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 
+0

不知道,但它发生在1914年1月1日之前的任何日期UTC –

+0

奇怪的是,我找不到这在文档 – s9gf4ult

+0

我没有看到这在9.1.9。你的区域设置是什么,可能有关? –

回答

2

这是时区的影响。在20世纪初之前,许多国家(如德国或俄罗斯)都有完全不同的制度,比如“平均太阳时间”,它不会完全转化为UTC。

因此,在时区0时(格林尼治时间的时候,因为没有UTC还)必须在作为本地时间叶卡捷琳堡(俄罗斯)为代表奇数时间偏移。

+04:02:24是实际偏移相比,UTC。

+0

那么,这是4小时2分24秒? – s9gf4ult

+0

@ s9gf4ult:的确如此。 –

-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) 
+0

你的答案与问题无关。为什么会发生这种情况,什么是“+04:02:24”?你的结果没有描述这一点。 – s9gf4ult

+0

+04:02:24是从UTC到您的语言环境 –

+0

的时间偏移,也参见[datestyle](http://www.postgresql.org/docs/8.2/static/runtime-config-client.html#GUC -DATESTYLE)参数 –