我真的需要存储本地日期和时间(飞机轮子的日期和时间)和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
;
答案 0 :(得分:1)
我个人觉得在尝试理解PostgreSQL timestamp with time zone
时,措辞timestamptz
会让人感到困惑,因为它并不存储任何时区。根据{{3}}
所有时区感知日期和时间都以UTC格式存储在内部。在显示给客户端之前,它们将在TimeZone配置参数指定的区域中转换为本地时间。
请注意,在该页面上,timestamp
和timestamptz
的存储特征和限制是相同的。
在我的脑海中,为了保持正确,我将timestamptz
翻译为"现实世界中的时间戳",并将timestamp
简单地翻译为"您可能没有' ; t意味着使用这种类型" (因为到目前为止,我发现自己只需要存储 与现实世界相关的时间戳。)
所以:
为什么
timestamptz
和timetz
函数会产生不同的结果?
这似乎是因为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;