postgresql - PostgreSQL 如何在内部存储日期时间类型
问题描述
在阅读 PostreSQL (13) 文档时,我遇到了这个页面,其中列出了不同日期时间类型的存储大小。
除其他外,它指出:
Name Storage Size Description Low Value High Value Resolution
---- ------------ ----------- --------- ---------- ----------
timestamp without time zone 8 bytes both date and time (no time zone) 4713 BC 294276 AD 1 microsecond
timestamp with time zone 8 bytes both date and time, with time zone 4713 BC 294276 AD 1 microsecond
time with time zone 12 bytes time of day (no date), with time zone 00:00:00+1559 24:00:00-1559 1 microsecond
我可以理解timestamp without time zone
:低值和高值之间大约有 (4713 + 294276) * 365 * 24 * 60 * 60 * 1000000 微秒。(不考虑日历变化等)。这相当于大约 2^63 个值,这些值可以存储在 8 个字节中。
但是,timestamp with timezone
具有相同的范围和分辨率,并且可以额外存储时区信息。如果我们已经使用 63 位作为值,则只剩下一位,这不足以存储时区,因此内部存储的工作方式必须有所不同。
更奇怪的是,虽然时间戳只使用 8 个time with time zone
字节,但需要 12 个字节,尽管它具有相同的分辨率和更小的允许值范围。
因此我的问题是:PostgreSQL 中这些类型的内部存储是如何工作的?
解决方案
并且可以额外存储时区信息
不,它不存储时区信息。
从 您链接到的同一页面
所有时区感知的日期和时间都存储在 UTC 内部。在显示给客户端之前,它们会转换为 TimeZone 配置参数指定的区域中的本地时间。
(强调我的)
所以timestamp
和timestamptz
都存放在同一个地方。它们只是在从客户端接受和返回值的方式上有所不同。
推荐阅读
- dart - 如何将事件类型传递给具有块模式的小部件?
- regression - 如何计算回归中变量的累积效应?
- wordpress - 如何正确使用 orderby 修改默认的 WordPress 查询
- python - 为灰度范围内的顶点分配随机颜色
- python - 最大化消耗能源
- python - 如何打开一个 URL,然后打开附加到关键字的另一个 URL?
- postgresql - 使用子字符串对 findAndCountAll 进行续集,并使用多列进行区分
- python - 我应该如何使用 python3 在 postgresql 中存储带时区的时间?
- java - 当您从两个不同的 Github 帐户克隆(通过 Eclipse 中的 git import)时,如何让 Eclipse 正确识别要使用的 SSH 密钥
- python - 将文本文件中的行拆分为 CSV 的几列