数据类型的时区存储"带时区的时间戳"

时间:2015-03-05 08:01:02

标签: sql postgresql datetime types timezone

在PostgreSQL中,数据类型timestamptimestamp with timezone都使用8个字节。

我的问题是:

  1. 用于存储日期和格式的格式在时间戳中的时间?
  2. 时区信息如何存储在timestamp with timezone中 类型,以及在阅读类型后如何解析?

2 个答案:

答案 0 :(得分:15)

这只是一种误解,源于有点误导性的类型名称。时区本身根本不存储。它只是作为偏移来计算实际存储的UTC时间戳。这完全符合SQL标准。

只是存储了时间点,没有区域信息。这就是为什么64位信息就足够了。时间戳根据会话的当前时区设置显示给客户端。

详细说明:

此外,由于Jon提到它,time with time zone在SQL标准中定义,因此在Postgres中实现,but its use is discouraged

  

time with time zone由SQL标准定义,但定义   表现出导致可疑用途的特性。

这是一种固有的模糊类型,无法正确处理DST

答案 1 :(得分:3)

查看documentation

  • 时间戳存储为整数或(已弃用)浮点数
  • 我不相信timestamp with timezone 可以在8个字节内正确编码,如果它实际存储了一个时区。只是时间戳需要64位,因为log 2 (298989 * 365 * 24 * 60 * 60 * 1000000)大于63.请注意time with time zone需要 12 字节,精度相同但范围为一天。

请参阅Erwin的答案,解释它实际上如何以8个字节存储 - 它应该被称为"时间戳没有时区,但存储在UTC中并转换为本地时区以供显示& #34 ;. ICK。