【问题标题】:postgres - Display timestamp column with and without TIMEZONE paramter settingpostgres - 显示带有和不带有 TIMEZONE 参数设置的时间戳列
【发布时间】:2018-11-03 04:50:15
【问题描述】:

首先,official document 表示以下内容:

为了解决这些困难,我们建议使用日期/时间类型 使用时区时同时包含日期和时间。我们不推荐 使用带时区的时间类型(尽管它支持 PostgreSQL 用于遗留应用程序并符合 SQL 标准)。 PostgreSQL 假定任何类型的本地时区 仅包含日期或时间。

在时间戳数据的显示上,它说:

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

因此,我将列定义为timestamp 数据类型,并以"2018-05-24 09:30:00+05:30" 插入到表中。基于上述几点,我希望看到 UTC 的时间戳(在 SELECT 查询输出中),即 2018-05-24 04:00:00,因为 TIME ZONE 设置为 UTC。而且,当我将参数更改为

SET TIME ZONE INTERVAL '+05:30' HOUR TO MINUTE;

我希望看到2018-05-24 09:30:00。但是,无论时区参数如何,我都看到查询输出为2018-05-24 09:30:00。这个观察结果与文档有何吻合?

对数据库的插入是使用 Javascript 完成的,而其他操作是使用 psql 完成的。

【问题讨论】:

    标签: postgresql datetime timezone timestamp


    【解决方案1】:

    文档中的关键措辞是“时区感知日期和时间”。这是指timestamptz 类型。

    重新表述文档:如果您希望在输入/输出期间发生时区,请使用 timestamptz 类型。

    1. 此类型在会话时区中呈现/输出。也就是说,所有值都将从 UTC 偏移并以区域后缀显示,例如+05:30
    2. 没有任何区域信息的文字被解释/输入为会话时区。也就是说,2018-05-24 09:30:00 的行为就像它具有后缀 +05:30
    3. 考虑而不是丢弃文字中的区域信息。也就是说,2018-05-24 09:30:00+05:30 将转换为 04:00 UTC。

    (输入端看起来有点神奇,但这是因为文字是 untyped 直到它们被强制转换或与输入的东西一起使用。也就是说,'2018-05-24 09:30:00+05:30' 本身不是 /em> timestamp 也不是 timestamptz。它是一堆字符,当您插入表或与列比较时会被解释。)

    【讨论】:

    • timestamptz,你的意思是TIMESTAMP WITH TIME ZONE吗?因为,我使用的列数据类型为TIMESTAMP。什么情况下TIME ZONE参数的设置不适用?
    • Yep! > timestamptz 被接受为timestamp with time zone 的缩写;这是一个 PostgreSQL 扩展。
    • 您可以使用类型转换来试验不同组合的行为:SELECT 'some value'::timestamp, 'some value'::timestamptz
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2019-11-08
    • 2020-09-19
    • 2021-01-16
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多