我们正在争论在 postgres 中存储时间戳的最佳方式。目前,所有时间戳都存储为 +00,并且我们有一个与每个客户端关联的时区。我们查找时区并转换发生某事的时间,这增加了复杂性,因为我们需要进行更多的连接和更复杂的查询。
另一种方法是连接到 Postgres 并设置连接的时区,它会一直更改为该时区。
我的问题是 ANZ 有 4-5 个时区。当我们尝试开具发票时,我们需要知道某些交易发生在哪一天,而跨越三个时区并没有完美的解决方案。
我正在考虑在时间戳中包含时区以使其更容易 - TIMESTAMP '1999-01-15 8:00:00 -8:00'
我的印象是这是最佳实践,但有些人说这是一个坏主意。我们需要为 ANZ 各地的客户提供准确的发票,什么是最好、最优雅的解决方案?
干杯
斯科特
这里没有万无一失的解决方案。
我的第一个建议:永远不要依赖服务器的默认时区。
我的第二个建议:选择timestamp
-timestamptz
根据数据的(主要)语义。
更详细地说:
PostgresSQL 有两个时间戳变体,名称容易混淆TIMESTAMP WITHOUT TIMEZONE (timestamp)
and TIMESTAMP WITH TIMEZONE (timestamptz)
。实际上,neither存储时区,甚至不存储偏移量。两种数据类型占用相同的宽度(4 个字节),并且它们的差异很微妙 - 更糟糕的是,如果您不完全理解它们并且您的服务器更改了时区,则可能会困扰您。我的理智规则集是:
Use TIMESTAMP WITH TIMEZONE (timestamptz)
用于存储主要与“物理”时间,您主要感兴趣的是查询是否event 1
之前是event 2
(无论时区),或计算时间间隔(以“物理单位”,例如秒;而不是“民用”单位,如天月等)。典型的例子是记录创建/修改时间——“”这个词通常意味着什么时间戳".
Use TIMESTAMP WITHOUT TIMEZONE (timestamp)
用于存储相关信息为的事件“民用时间”(也就是说,字段{year-month-day hour-min-sec}
作为一个整体),并且查询涉及日历计算。在这种情况下,您将仅在此处存储“本地时间”,即相对于某些未指定(不相关、隐含或存储在其他地方)时区的日期时间。
第二个选项使您更容易查询“2013 年 1 月 20 日发生的所有事件”(在每个相应的地区/国家/时区),但使查询“2013 年 1 月 20 日发生的所有事件”变得更加困难。 (物理上)发生在参考事件之前”(除非我们知道它们位于同一时区)。你选。
如果您需要完整的内容,则两者都不够,您需要将时区或偏移量存储在附加字段中。另一种选择是存储这两个字段,这会浪费一些字节,但查询效率更高。
也可以看看这个答案 https://stackoverflow.com/questions/6627289/what-is-the-most-recommended-way-to-store-time-in-postgresql-using-java/6627999#6627999.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)