数据类型 "timestamp with time zone" 中的时区存储



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

我的问题是:

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

有点误导的类型名称而产生的误解。时区本身根本不存储。它只是充当计算实际存储的 UTC 时间戳(输入(的偏移量。或者作为装饰器,根据当前或给定的时区(输出(显示时间戳。这都是根据SQL标准。

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

详:

  • 在 Rails 和 PostgreSQL 中完全忽略时区

此外,由于Jon提到了它,time with time zone是在SQL标准中定义的,因此在Postgres中实现。但它本质上是不明确的数据类型,无法可靠地处理 DST,因此不鼓励使用它:

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

查看文档:

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

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

相关内容

  • 没有找到相关文章