我应该在PostgreSQL数据库中选择哪种时间戳类型?

时间:2011-05-27 10:39:22

标签: postgresql timezone timestamp

我想在多时区项目的上下文中定义在Postgres数据库中存储时间戳的最佳实践。

我可以

  1. 选择TIMESTAMP WITHOUT TIME ZONE并记住在此字段的插入时间使用了哪个时区
  2. 选择TIMESTAMP WITHOUT TIME ZONE并添加另一个字段,其中包含插入时使用的时区名称
  3. 选择TIMESTAMP WITH TIME ZONE并相应地插入时间戳
  4. 我略微偏好选项3(带时区的时间戳),但希望对此事有一个受过教育的意见。

3 个答案:

答案 0 :(得分:138)

答案 1 :(得分:54)

肖恩的回答过于复杂和误导。

事实是“WITH TIME ZONE”和“WITHOUT TIME ZONE”都将该值存储为类似unix的绝对UTC时间戳。区别在于时间戳的显示方式。当“WITH time zone”时,显示的值是转换为用户区域的UTC存储值。当“没有时区”时,UTC存储的值被扭曲,以便显示相同的钟面,无论用户设置了什么区域。“

“无时区”可用的唯一情况是,无论实际区域如何,时钟面值都适用。例如,当时间戳指示投票亭何时可能关闭时(即,它们在20:00关闭,而不管人的时区如何)。

使用选择3.除非有特殊原因,否则请始终使用“WITH time zone”。

答案 2 :(得分:5)

我倾向于选项3,因为Postgres可以为你重新计算相对于时区的时间戳,而另外两个你必须自己做。使用时区存储时间戳的额外存储开销实际上可以忽略不计,除非您正在谈论数百万条记录,在这种情况下,您可能已经拥有相当丰富的存储要求。