4

我正在使用字段类型“带时区的时间戳”字符串“1858-11-17 01:09:05+0000”插入表中,并取回格式化值“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
4

2 回答 2

2

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

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

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

于 2013-05-15T19:38:44.753 回答
-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)
于 2013-05-15T19:12:11.093 回答