数据库 – Postgres时间戳

前端之家收集整理的这篇文章主要介绍了数据库 – Postgres时间戳前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们正在讨论在postgres中存储时间戳的最佳方法.目前,所有时间戳都存储为00,并且我们有一个与每个客户关联的时区.我们查找时区并转换发生事件的时间,这会增加复杂性,因为我们需要进行更多连接和更复杂的查询.

另一种方法是连接到Postgres并设置连接的时区,它将所有时间都更改为该时区.

我的问题是在ANZ有4-5个时区.当我们尝试开发票时,我们需要知道某些交易发生在哪一天,并且在三个时区之间没有完美的@R_301_463@案.

我想在时间戳中包含时区以使其更容易 – TIMESTAMP’1999-01-15 8:00:00 -8:00′

我的印象是这是最好的做法,但有些人说这是一个坏主意.我们将为ANZ的客户提供准确的发票,最佳@R_301_463@案和最优雅的@R_301_463@案是什么?

干杯
斯科特

解决方法

这里没有防弹@R_301_463@案.

我的第一个建议:永远不要依赖服务器的默认时区.

我的第二个建议是:根据数据的(主要)语义在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.

猜你在找的MsSQL相关文章