代码之家  ›  专栏  ›  技术社区  ›  cogitoergosum

Postgres-显示时间戳列,包括或不包括时区参数设置

  •  1
  • cogitoergosum  · 技术社区  · 6 年前

    首先, official document 如下所示:

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

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

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

    因此,我将列定义为 timestamp 数据类型并作为 "2018-05-24 09:30:00+05:30" . 基于上面提到的点,我希望在UTC中看到时间戳(在选择查询输出中),即 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年5月24日09:30:00 . 这一观察结果如何与文档相符?

    对数据库的插入是用JavaScript完成的,而其他操作则是用JavaScript完成的。 psql .

    1 回复  |  直到 6 年前
        1
  •  1
  •   Chris Bandy    6 年前

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

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

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

    (输入端看起来有点神奇,但这是因为文本 非类型化 直到他们被铸造或使用某种类型的东西。也就是说, '2018-05-24 09:30:00+05:30' 就其本身而言 也不 时间戳和时间戳。这是一堆在插入表或与列进行比较时会被解释的字符。)