65

unix 时间戳的 PostgreSQL 字段类型:

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

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


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

3 回答 3

106

现在 (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 纪元。

所以我们学了什么?

  1. smallint显然是一个糟糕的选择。
  2. integer目前是一个不错的选择,但您的软件将在 2038 年爆炸。Y2K 启示录与2038 年问题无关。
  3. 使用bigint是最好的选择。这是针对大多数可以想象的人类需求的未来证明,尽管医生可能仍然会批评它。

您可能会或可能不会考虑是否最好以另一种格式(例如ISO 8601标准)存储您的时间戳。

于 2014-04-09T19:40:17.497 回答
30

我只是使用 TIMESTAMP WITH(OUT) TIME ZONE 并在需要时使用 EXTRACT 来获取 UNIX 时间戳表示。

相比

SELECT NOW();

SELECT EXTRACT(EPOCH FROM NOW());
于 2012-08-03T15:57:00.320 回答
2

整数会很好,但还不够好,因为 postgresql 不支持无符号类型

于 2012-08-03T16:00:09.980 回答