在PostgreSQL中,数据类型timestamp
和timestamp with timezone
都使用8个字节。
我的问题是:
- 使用什么格式在时间戳中存储日期和时间?
- 时区信息如何存储在
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存储并转换为本地时区进行显示"。哎呀。