PostgreSQL内部如何存储时间戳?

J. *_*hoi 7 postgresql timestamp

对于MySQL来说,

TIMESTAMP 值存储为自纪元 ('1970-01-01 00:00:00' UTC) 以来的秒数`

PostgreSQL 版本小于或等于9.6时

时间戳值存储为午夜 2000-01-01 之前或之后的秒数

对于版本大于或等于 10 的PostgreSQL ,没有对此的解释

我有两个关于PostgreSQL内部逻辑的问题。

  1. 仍然使用9.6版本相同的标准吗?
  2. 为什么是“2000年1月1日午夜”?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 纪元不同的标准似乎需要额外的偏移计算。

Lau*_*lbe 6

9.6 文档中的信息是错误的。时间戳自 2000-01-01 00:00:00 起以微秒形式存储。

include/datatype/timestamp.h

/*
 * Timestamp represents absolute time.
 *
 * [...]
 *
 * Timestamps, as well as the h/m/s fields of intervals, are stored as
 * int64 values with units of microseconds.  (Once upon a time they were
 * double values with units of seconds.)
 *
 * [...]
 */

typedef int64 Timestamp;
typedef int64 TimestampTz;
Run Code Online (Sandbox Code Playgroud)

早在 9.6 中,还可以选择将时间戳存储为浮点值,但此后已被删除。

这应该回答你的第一个问题。

选择 2000 的原因可能源于可以将时间戳存储为浮点值的时间。在这里,接近纪元的值的精度变得更好,选择比 1970 年(请注意,那是在 2000 年之前)更面向未来的东西是有意义的。

减去一个常数来计算 Unix 纪元并不费力。