用于unix时间戳的PostgreSQL字段类型?

时间:2012-08-03 15:53:49

标签: postgresql postgresql-9.1

unix时间戳的PostgreSQL字段类型:

  • 将其存储为unix时间戳
  • 也可以将其作为unix时间戳检索。

一直在经历Date/Time Types postgreSQL V 9.1


  • 整数是最好的方式!? (这是我在使用MySQL时所做的。曾使用int(10)

4 个答案:

答案 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时期。

那么,我们学到了什么?

  1. smallint显然是一个糟糕的选择。
  2. integer目前是一个不错的选择,但你的软件会在2038年爆炸.Y2K的启示录在Year 2038 Problem没有任何内容。
  3. 使用bigint是最佳选择。这是针对大多数可以想象的人类需求的未来证明,但the Doctor可能仍然criticise
  4. 您可能会或可能不会考虑将时间戳存储为其他格式(例如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不支持无符号类型