J. *_*hoi 7 postgresql timestamp
对于MySQL来说,
TIMESTAMP 值存储为自纪元 ('1970-01-01 00:00:00' UTC) 以来的秒数`
PostgreSQL 版本小于或等于9.6时
时间戳值存储为午夜 2000-01-01 之前或之后的秒数
对于版本大于或等于 10 的PostgreSQL ,没有对此的解释
我有两个关于PostgreSQL内部逻辑的问题。
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
:
/*
* 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 纪元并不费力。
归档时间: |
|
查看次数: |
1595 次 |
最近记录: |