另一种方法是连接到Postgres并设置连接的时区,它将所有时间都更改为该时区.
我的问题是在ANZ有4-5个时区.当我们尝试开发票时,我们需要知道某些交易发生在哪一天,并且在三个时区之间没有完美的解决方案.
我想在时间戳中包含时区以使其更容易 – TIMESTAMP’1999-01-15 8:00:00 -8:00′
我的印象是这是最好的做法,但有些人说这是一个坏主意.我们将为ANZ的客户提供准确的发票,最佳解决方案和最优雅的解决方案是什么?
干杯
斯科特
解决方法
我的第一个建议:永远不要依赖服务器的默认时区.
我的第二个建议是:根据数据的(主要)语义在timestamp-timestamptz之间进行选择.
更详细:
Postgressql有两个时间戳变体,令人困惑地命名为TIMESTAMP WITHOUT TIMEZONE(时间戳)和TIMESTAMP WITH TIMEZONE(timestamptz).实际上,既不存储时区,也不存储偏移量.两种数据类型占用相同的宽度(4个字节),它们的区别很微妙 – 更糟糕的是,如果你不完全理解它们并且你的服务器改变了时区,它会咬你.我的理智规则是:
>使用TIMESTAMP WITH TIMEZONE(timestamptz)存储主要与“物理”时间相关的事件,您主要感兴趣的是查询事件1是否在事件2之前(无论时区如何),还是计算时间间隔(在“物理单位“,例如,秒;不是”民用“单位,如天 – 月等).典型的例子是记录创建/修改时间 – 通常用“Timestamp”这个词来表示.
>使用TIMESTAMP WITHOUT TIMEZONE(时间戳)存储相关信息为“民用时间”的事件(即整个字段{year-month-day hour-min-sec}),查询涉及日历计算.在这种情况下,您只会在此存储“本地时间”,即相对于某些未指定(不相关或隐含或存储在其他地方)时区的日期时间.
第二个选项使您更容易查询,例如“在2013-01-20’日发生的所有事件”(在每个相应的区域/国家/时区中) – 但是查询“所有事件”更加困难在参考事件之前(物理上)“(除非我们知道它们在同一时区).你选.
如果您需要完整的东西,这两者都不够,您需要将时区或偏移量存储在附加字段中.另一个选项,浪费几个字节,但对查询更有效,是存储两个字段.
另见this answer.