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

Thi*_*key 49 postgresql postgresql-9.1

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

  • 将其存储为unix时间戳
  • 将其检索为unix时间戳.

已经过postgreSQL V 9.1的日期/时间类型.


  • 整数是最好的方法!?(这是我在使用MySQL时所做的.已使用过int(10))

Ric*_*ard 73

unix epoch时间戳现在(2014-04-09)是1397071518.所以我们需要一种能够存储至少这么大的数字的数据类型.

有哪些数据类型?

如果您参考有关数字类型的PostgreSQL 文档,您将找到以下选项:

Name      Size     Minimum               Maximum
smallint  2 bytes  -32768                +32767
integer   4 bytes  -2147483648           +2147483647
bigint    8 bytes  -9223372036854775808  +9223372036854775807
Run Code Online (Sandbox Code Playgroud)

这在时间表示方面意味着什么?

现在,我们可以使用epoch转换器获取这些数字并将它们转换为日期:

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
Run Code Online (Sandbox Code Playgroud)

请注意,在最后一个实例中,使用秒可以使您进入过去和未来,这可能无关紧要.我给出的结果是,如果你用毫秒表示unix时期.

所以我们学了什么?

  1. smallint 显然是一个糟糕的选择.
  2. integer目前是一个不错的选择,但你的软件将在2038年爆炸.在2038年的问题上,Y2K的启示没有任何结果.
  3. 使用bigint是最好的选择.虽然博士可能仍然批评它,但这针对大多数可以想象的人类需求的未来证明.

您可能会或可能不会考虑将时间戳存储为其他格式(例如ISO 8601标准)是否最佳.


Gor*_*onM 24

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

相比

SELECT NOW();
Run Code Online (Sandbox Code Playgroud)

SELECT EXTRACT(EPOCH FROM NOW());
Run Code Online (Sandbox Code Playgroud)

  • 然后转换为商店上的Postgres时间戳,并在您获取数据时转换回(使用我向您展示的提取).这是一个比使用int或string来避免它更好的解决方案 (6认同)
  • 默认情况下,"TIMESTAMP WITH TIME ZONE"存储为2000-01-01 UTC午夜的微秒的64位整数(忽略闰秒,因此更像UT1).这可以非常快速,轻松地转换为Unix时间,同时允许简单的演示和日期数学.如果你真的想要更粗糙的分辨率,整数表示和日期计算的困难,可以随意使用bigint或数字.没有太多的情况下,这是一个净胜利,但也许你有少数几个. (6认同)

jap*_*968 6

我不明白为什么这个问题有一些反对票.

无论如何,我在数据库管理员站点中找到了一个密切相关的问题(有很多正面投票).

这只是建议看看那里,因为有关于这个非平凡主题的更完整的信息.


Cyb*_*m0n 2

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

  • Maia 存储真的非常昂贵,以至于您需要担心每行额外的几个字节? (2认同)
  • @GordonM 抱歉挖坟,但很大程度上取决于您的数据库收到的流量。 (2认同)