【问题标题】:PostgreSql: Getting strange-formated "timestamp with time zone"PostgreSql:获取格式奇怪的“带时区的时间戳”
【发布时间】:2013-05-15 18:27:58
【问题描述】:

我正在将字段类型“带时区的时间戳”字符串“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

【问题讨论】:

  • 不知道,但它发生在 1914-01-01 UTC 之前的任何日期
  • 奇怪,我在文档中找不到这个
  • 我在 9.1.9 上没有看到这个。您的区域设置是什么,可能相关?
  • 我在 Linux 9.2.4 BRT 时区。 SQL Fiddle 9.2.4 不会发生这种情况,可能是因为服务器设置为 UTC
  • 如果我这样做set timezone = 'utc',它就会恢复正常。

标签: database postgresql datetime formatting timestamp


【解决方案1】:

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

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

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

【讨论】:

  • 所以,这是 4 小时 2 分 24 秒?
【解决方案2】:

它将您的输入值解释为 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)

【讨论】:

  • 您的回答与问题无关。为什么会发生这种情况,什么是 "+04:02:24" ?您的结果没有说明这一点。
  • +04:02:24 是从 UTC 到您的语言环境的时间偏移
  • 另见datestyle参数
猜你喜欢
  • 2017-04-29
  • 1970-01-01
  • 2020-09-19
  • 2020-09-25
  • 2014-11-30
  • 1970-01-01
  • 2013-03-27
  • 2014-01-24
  • 1970-01-01
相关资源
最近更新 更多