我想在多时区项目的上下文中定义在Postgres数据库中存储时间戳的最佳实践。
我可以
TIMESTAMP WITHOUT TIME ZONE
并记住在此字段的插入时间使用了哪个时区TIMESTAMP WITHOUT TIME ZONE
并添加另一个字段,其中包含插入时使用的时区名称TIMESTAMP WITH TIME ZONE
并相应地插入时间戳我略微偏好选项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可以为你重新计算相对于时区的时间戳,而另外两个你必须自己做。使用时区存储时间戳的额外存储开销实际上可以忽略不计,除非您正在谈论数百万条记录,在这种情况下,您可能已经拥有相当丰富的存储要求。