PostgreSQL timestamptz和timetz函数

时间:2015-05-01 19:40:10

标签: postgresql timezone-offset

我真的需要存储本地日期和时间(飞机轮子的日期和时间)和utc偏移量,以便我可以转换为utc来计算间隔(飞行持续时间)。人们在当地时间旅行,你需要utc进行跨时区计算。我原本希望使用timestamptz,但它绝对不会 为此目的而工作。它将所有内容转换为postgres时区的函数。就我而言,这是yyyy-dd-mm hh:mi:ss-07

然而,我调查时间只是为了涵盖所有的基础。它完全存储我需要的东西。它保留了当地时间,同时为utc提供了偏移量。除了现在我需要两列而不是一列来存储信息。

我的问题是: 为什么timestamptz和timetz函数会产生不同的结果? 有没有办法让timestamptz包括本地时区偏移而不是系统时区偏移? 以下是用于说明差异的查询:

select cast('2015-05-01 11:25:00 america/caracas' as timestamptz)

-- 2015-05-01 08:55:00-07
;

select cast('2015-05-01 11:25:00 america/caracas' as timetz)

-- 11:25:00-04:30
;

1 个答案:

答案 0 :(得分:1)

我个人觉得在尝试理解PostgreSQL timestamp with time zone时,措辞timestamptz会让人感到困惑,因为它并不存储任何时区。根据{{​​3}}

  

所有时区感知日期和时间都以UTC格式存储在内部。在显示给客户端之前,它们将在TimeZone配置参数指定的区域中转换为本地时间。

请注意,在该页面上,timestamptimestamptz的存储特征和限制是相同的。

在我的脑海中,为了保持正确,我将timestamptz翻译为"现实世界中的时间戳",并将timestamp简单地翻译为"您可能没有' ; t意味着使用这种类型" (因为到目前为止,我发现自己只需要存储 与现实世界相关的时间戳。)

所以:

  

为什么timestamptztimetz函数会产生不同的结果?

这似乎是因为PostgreSQL没有觉得他们被允许像timetz那样让timestamptz工作:

  

类型time with time zone由SQL标准定义,但该定义显示的属性导致可疑用途。

我的猜测是其中一些"属性"是那些他们不喜欢的人,你做的。

  

有没有办法让timestamptz包含本地时区偏移量而不是系统时区偏移量?

timestamptz值没有存储偏移量。它们只是真实世界的时间戳。因此,存储本地时区的方式是您已经考虑过的方式:单独存储。

create table my_table (
    happened timestamptz,
    local_time_zone varchar
);
select happened at time zone 'UTC', happened at time zone local_time_zone
    from my_table;