postgres - 显示包含和不包含TIMEZONE参数设置的时间戳列

时间:2018-05-24 04:51:10

标签: postgresql datetime timezone timestamp

首先,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完成的。

1 个答案:

答案 0 :(得分: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。
  4. (输入端似乎有点神奇,但它是因为文字无类型直到它们被强制转换或被用于输入的东西。也就是说,'2018-05-24 09:30:00+05:30'本身既不是时间戳也不是timestamptz。它是在插入表格或与列比较时解释的一堆字符。)