2013-05-15 69 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)參數 –