在MySQL的情况下,
TIMESTAMP 值存储为自纪元以来的秒数('1970-01-01 00:00:00' UTC)`
如果 PostgreSQL 版本小于或等于 9.6
时间戳值存储为 2000-01-01 午夜之前或之后的秒数
如果 PostgreSQL 的版本大于等于 10,则对此没有解释
关于 PostgreSQL 的内部逻辑,我有两个问题。
- 它仍然使用与 9.6 版相同的标准吗?
- 为什么是“午夜 2000-01-01”?Unix 纪元从
1970-01-01 00:00:00 UTC
. J2000 纪元从12 noon (midday) on January 1, 2000
.
似乎只有少数系统使用2000-01-01 00:00:00
.
因为 PostgreSQL 提供了将 UNIX 纪元转换为时间戳to_timestamp
或反之亦然的函数EXTRACT(EPOCH FROM ...)
,所以使用不同于 UNIX 纪元的标准似乎需要额外的偏移计算。
9.6 文档中的信息是错误的。自 2000-01-01 00:00:00 以来,时间戳存储为微秒。
见
include/datatype/timestamp.h
:早在 9.6 中,还可以选择将时间戳存储为浮点值,但此后已被删除。
那应该回答你的第一个问题。
选择 2000 的原因可能源于您可以将时间戳存储为浮点值的时间。在这里,对于接近时代的值,精度变得更好,选择比 1970 年更具前瞻性的东西是有意义的(请注意,那是在 2000 年之前)。
减去一个常数来计算 Unix 纪元并不费力。