【问题标题】:PostgreSQL timestamptz and timetz functionsPostgreSQL timestamptz 和 timetz 函数
【发布时间】:2015-05-01 19:40:09
【问题描述】:

我真的需要存储本地日期和时间(飞机轮子更新日期和时间)和 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 timezone-offset


    【解决方案1】:

    当我试图理解 PostgreSQL 的 timestamptz 时,我个人觉得 timestamp with time zone 的措辞令人困惑,因为它不存储任何时区。根据the docs:

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

    请注意,在该页面上,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;
    

    【讨论】:

    • >> 没有为 timestamptz 值存储偏移量。它们只是现实世界的时间戳。实际上有一个偏移量被存储;它是 postgres 位置设置的偏移量。在我的示例中,它是 -7,因为我的位置恰好在 PDT。我仍然感到困惑。他们为什么要打扰?为什么不将其存储为 UTC 并完成它呢?如果我想知道飞机何时从加拉加斯起飞,我认为知道 postgres 实现设置的偏移量没有任何价值。
    • 我从链接到的文档中的第一句话回答了所有这些以及更多问题;再读一遍。他们确实只是将其存储为 UTC。当以默认方式转换为字符串时,它会在PDT中显示。那没有存储在里面。
    • 我很困惑。西雅图是(过去)4:54,纽约是 7:54,伦敦是 11:54。
    • 我很困惑。西雅图(过去)是 4:54,纽约是 7:54,伦敦是 11:54。我运行这些命令: create table timestamptz_tst (a timestamptz, b timetz);插入 timestamptz_tst 值('2015-05-02 07:54:00 america/new_york', '2015-05-02 07:54:00 america/new_york');从timestamptz_tst中选择*; -- 2015-05-02 04:54:00-07 07:54:00-04 Postgres 将纽约时间转换为西海岸时间,并返回西海岸时间与 UTC 的偏移量。我想知道如果 postgres 不存储 -7 是从哪里来的?
    • 对不起,计时器让我失望了
    猜你喜欢
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2013-12-15
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多