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

Eri*_*ang 6 sql postgresql timezone datetime types

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

我的问题是:

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

Erw*_*ter 15

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

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

细节:

此外,由于Jon提到它,time with time zone在SQL标准中定义并因此在Postgres中实现,但不建议使用它:

time with time zone 由SQL标准定义,但该定义显示的属性导致可疑的有用性.

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

  • 哎呀,这真是“可怕的”误导。感谢您纠正我的误解。 (3认同)

Jon*_*eet 5

查看文档

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

请参阅 Erwin 的回答以解释它实际上是如何设法存储在 8 个字节中的——它应该被称为“没有时区的时间戳,但存储在 UTC 中并转换为本地时区以进行显示”。哎呀。

  • 这里房间里的大象是:时区根本没有存储。 (2认同)