PostgreSQL timestamptz和timetz函数

PostgreSQL timestamptz和timetz函数,postgresql,timezone-offset,Postgresql,Timezone Offset,我真的需要存储本地日期和时间(飞机轮启动日期和时间)以及utc偏移量,以便我可以转换为utc来计算间隔(飞行持续时间)。人们在当地时间旅行,您需要utc进行跨时区计算。我曾希望使用timestamptz,但它绝对不能用于此目的。它将一切转换为postgres时区的函数。就我而言,这是yyyy-dd-mm hh:mi:ss-07 然而,我调查timetz只是为了涵盖所有的基础。它正好储存了我需要的东西。它保留本地时间,同时提供utc的偏移量。除了现在我需要两列而不是一列来存储信息 我的问题是: 为

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

然而,我调查timetz只是为了涵盖所有的基础。它正好储存了我需要的东西。它保留本地时间,同时提供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
;

我个人认为,在试图理解PostgreSQL的
timestamp
时,带时区的
时间戳的措辞令人困惑,因为它不存储任何时区。据

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

请注意,在该页面上,
timestamp
timestamp
的存储特性和限制是相同的

在我的头脑中,为了让事情保持清晰,我将
timestamp
翻译为“现实世界中的时间戳”,而将普通
timestamp
翻译为“您可能无意使用这种类型”(因为到目前为止,我只发现自己需要存储与现实世界相关的时间戳)

因此:

为什么
timestamtz
timetz
函数给出不同的结果

这似乎是因为PostgreSQL觉得他们不允许
timetz
timestz
那样工作:

SQL标准定义了带时区的时间类型
,但该定义显示的属性会导致有用性受到质疑

我的猜测是,其中一些“属性”是他们不喜欢的,而你喜欢

以及:

是否有办法使
timestamtz
包含本地时区偏移,而不是系统时区偏移

没有为
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;

>>没有为timestamptz值存储偏移量。它们只是真实世界的时间戳。实际上,存储了一个偏移量;它是postgres位置设置的偏移量。在我的示例中,它是-7,因为我的位置恰好在PDT中。我仍然感到困惑。他们为什么要麻烦?为什么不将其存储为UTC并使用它呢?如果我想知道一架飞机何时从加拉加斯起飞,我认为知道postgres实施的设置偏移量没有任何价值;再读一遍。他们只是将其存储为UTC。当以默认方式转换为字符串时,它将在PDT中显示。那不是储存在里面的,我很困惑。西雅图是4点54分,纽约是7点54分,伦敦是11点54分。我很困惑。西雅图是4点54分,纽约是7点54分,伦敦是11点54分。我运行以下命令:创建表timestamptz_tst(a timestamptz,b timetz);插入时间戳tst值(“2015-05-02 07:54:00美国/纽约”,“2015-05-02 07:54:00美国/纽约”);从时间戳中选择*2015-05-02 04:54:00-07:54:00-04 Postgres将纽约时间转换为西海岸时间,并返回西海岸时间与utc的偏移量。如果postgres不存储-7,我想知道它是从哪里来的?对不起,计时器抓到我了