unix时间戳的PostgreSQL字段类型:
一直在经历Date/Time Types postgreSQL V 9.1。
int(10)
)答案 0 :(得分:62)
现在的unix纪元时间戳(2014-04-09)是1397071518.所以我们需要一种能够存储至少这么大的数字的数据类型。
有哪些可用的数据类型?
如果您参考PostgreSQL documentation on numeric types,您会找到以下选项:
Name Size Minimum Maximum
smallint 2 bytes -32768 +32767
integer 4 bytes -2147483648 +2147483647
bigint 8 bytes -9223372036854775808 +9223372036854775807
这在时间表示方面意味着什么?
现在,我们可以使用epoch converter
获取这些数字并将其转换为日期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的启示录在Year 2038 Problem没有任何内容。bigint
是最佳选择。这是针对大多数可以想象的人类需求的未来证明,但the Doctor可能仍然criticise。您可能会或可能不会考虑将时间戳存储为其他格式(例如ISO 8601标准)是否最佳。
答案 1 :(得分:23)
我只需要使用TIMESTAMP WITH(OUT)TIME ZONE,并在需要时使用EXTRACT获取UNIX时间戳表示。
比较
SELECT NOW();
带
SELECT EXTRACT(EPOCH FROM NOW());
答案 2 :(得分:6)
我不明白为什么这个问题会有一些反对票。
无论如何,我在数据库管理员网站上找到了closely related question(有很多正面投票)。
这只是建议看看那里,因为有关于这个非平凡主题的更完整的信息。
答案 3 :(得分:3)
整数会很好,但不够好,因为postgresql不支持无符号类型