我真的需要存储本地日期和时间(飞机轮子更新日期和时间)以及utc偏移量,以便我可以转换为utc来计算间隔(飞行持续时间)。人们在当地时间旅行,您需要utc进行跨时区计算。我曾希望使用timestamptz,但它绝对不能用于此目的。它将所有内容转换为postgres时区的函数。在我的例子中,这是yyyy-dd-mm hh:mi:ss-07
然而,我调查蒂梅兹只是为了覆盖所有的基地。它正好储存了我需要的东西。它保留本地时间,同时将偏移量提供给utc。但现在我需要两列而不是一列来存储信息。
我的问题是:
为什么timestamptz函数和timetz函数给出不同的结果?
有没有办法使时间戳包含本地时区偏移量而不是系统时区偏移量?
以下是说明差异的查询:

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
;

最佳答案

我个人认为,在理解PostgreSQL的timestamp with time zone时,timestamptz这个词会让人感到困惑,因为它不存储任何时区。根据the docs:
所有时区感知的日期和时间都存储在UTC内部。在显示给客户端之前,它们将在时区配置参数指定的区域中转换为本地时间。
请注意,在该页上,timestamptimestamptz的存储特性和限制是相同的。
在我的头脑中,为了保持事情的正确性,我将timestamptz转换为“真实世界中的时间戳”,将timestamp转换为“您可能并不打算使用这种类型”(因为,到目前为止,我只发现自己需要存储与真实世界相关的时间戳)
所以:
为什么timestamptztimetz函数会给出不同的结果?
这似乎是因为PostgreSQL认为他们没有被允许让timetztimestamptz那样工作:
类型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;

关于postgresql - PostgreSQL timestamptz和timetz函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29993956/

10-15 20:47