unix 时间戳的 PostgreSQL 字段类型:
- 将其存储为 unix 时间戳
- 也可以将其检索为 unix 时间戳。
一直在经历Date/Time Types postgreSQL V 9.1。
- 整数是最好的方法吗!?(这是我在使用 MySQL 时所做的。曾经使用过
int(10)
)
unix 时间戳的 PostgreSQL 字段类型:
一直在经历Date/Time Types postgreSQL V 9.1。
int(10)
)现在 (2014-04-09) 的 unix 纪元时间戳是 1397071518。所以我们需要一种能够存储至少这么大数字的数据类型。
有哪些数据类型可用?
如果您参考有关数字类型的 PostgreSQL 文档,您会发现以下选项:
Name Size Minimum Maximum
smallint 2 bytes -32768 +32767
integer 4 bytes -2147483648 +2147483647
bigint 8 bytes -9223372036854775808 +9223372036854775807
这在时间表示方面意味着什么?
现在,我们可以使用纪元转换器将这些数字转换为日期:
Name Size Minimum Date Maximum Date
smallint 2 bytes 1969-12-31 1970-01-01
integer 4 bytes 1901-12-13 2038-01-18
bigint 8 bytes -292275055-05-16 292278994-08-17
请注意,在最后一个例子中,使用秒数会让您进入过去和未来,这可能无关紧要。我给出的结果是如果您以毫秒为单位表示 unix 纪元。
所以我们学了什么?
smallint
显然是一个糟糕的选择。integer
目前是一个不错的选择,但您的软件将在 2038 年爆炸。Y2K 启示录与2038 年问题无关。bigint
是最好的选择。这是针对大多数可以想象的人类需求的未来证明,尽管医生可能仍然会批评它。您可能会或可能不会考虑是否最好以另一种格式(例如ISO 8601标准)存储您的时间戳。
我只是使用 TIMESTAMP WITH(OUT) TIME ZONE 并在需要时使用 EXTRACT 来获取 UNIX 时间戳表示。
相比
SELECT NOW();
和
SELECT EXTRACT(EPOCH FROM NOW());
整数会很好,但还不够好,因为 postgresql 不支持无符号类型