Postgres 时间戳

2023-12-21

我们正在争论在 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(使用前将#替换为@)

Postgres 时间戳 的相关文章

随机推荐

  • 合并重叠间隔并跟踪 BigQuery SQL 中的最大值

    我正在尝试解决一个问题 我想合并给定列 ID 的重叠间隔 但我也想跟踪每个重叠间隔的最大值 我有每个间隔的 start time 和 stop time 每个间隔都有一个与之关联的层次结构 优先级 这些是表中的以下列 id 开始时间 停止时
  • 每当 gem: 我设置 :output 但日志文件没有出现在我期望的位置

    In my schedule rb文件我有以下几行 set output log cron log log every 5 minutes do command echo hello end I ran whenever w正如这个问题所建
  • 如何让 Vim 突出显示匹配的括号?

    When I browse code in Vim I need to see opening and closing parenthesis brackets and pressing seems unproductive I tried
  • foreach 如何将对象转换为指定类型?

    我有一个问题foreach行为在C 我的自定义类实现了自定义GetEnumerator 该方法返回另一个object可以隐式转换为string 但是如果我这样做foreach string s in customClass 它在运行时失败
  • VFS:已达到文件最大限制 1231582

    我正在运行 Linux 2 6 36 内核 并且看到一些随机错误 像 ls error while loading shared libraries libpthread so 0 cannot open shared object fil
  • 使用扩展器进行 Knockout.js 验证 - 防止加载时验证

    我已经对 名字 实施了非常基本的必需验证 很大程度上基于淘汰赛网站上建议的示例 http knockoutjs com documentation extenders html http knockoutjs com documentati
  • 调整包含圆圈的图像映射的大小

    我正在尝试绘制下图中的所有数字 我已经完成了 但现在我想根据窗口的宽度动态调整图像和地图的大小 这是相关的html
  • 无法确定搁置数据库类型,whichdb 无法识别 gdb

    如果我尝试打开刚刚由 shelve 创建的文件 为什么 shelve 会引发错误 import shelve info file name Users bacon myproject temp test info info file she
  • 在结构中启动数组时遇到问题

    class CRA Account int tax 4 double refund 4 int SIN public CRA Account CRA Account CRA Account SIN 0 tax 4 0 refund 4 0
  • ASP.NET Core - System.Text.Json:如何拒绝有效负载中的未知属性?

    ASP NET Core 7 中的 Web API 与 System Text Json 我需要拒绝 PUT POST API 上的 JSON 有效负载 这些 API 指定了其他属性 这些属性不映射到模型中的任何属性 所以如果我的模型是 p
  • Angular UI Router - 使用 ui-sref 导航到动态状态时会出现双斜杠

    我正在创建一个 CMS 系统 因此我希望动态创建状态 由于您无法在配置阶段发出 http 请求 因此我决定在 run 函数中添加路由 如下所述 http blog brunscopelliti com how to defer route
  • 按列值过滤数据帧的行[重复]

    这个问题在这里已经有答案了 我有一个包含 10 列的数据框 一栏给出了鸟类的名称 实际上有 300 个物种 但我只对其中 200 个感兴趣 我只想保留这 200 个物种的信息 我的桌子截图 https i stack imgur com O
  • Hibernate中不同的保存方式有什么区别?

    Hibernate 有一些方法可以以某种方式获取您的对象并将其放入数据库中 它们之间有什么区别 何时使用哪个 为什么没有一种智能方法知道何时使用什么 到目前为止我已经确定的方法是 save update saveOrUpdate saveO
  • 转置一维 NumPy 数组

    我使用 Python 和 NumPy 并且在 转置 方面遇到一些问题 import numpy as np a np array 5 4 print a print a T 调用a T没有转置数组 如果a例如 然后它会正确转置 但我需要转置
  • 如何使用 scalaz.WriterT 记录 for 表达式?

    如何使用 scalaz WriterT 进行日志记录 关于 Monad 变压器 这是一个非常简短的介绍 您可能会找到更多信息哈斯克尔维基 http www haskell org haskellwiki Monad Transformers
  • 如何获取带有浅蓝色字段的 iPhone 地图应用程序蓝点当前位置?

    我认为标题是不言自明的 目前 当我为当前位置添加默认注释时 let currentAnnot MKPointAnnotation currentAnnot coordinate loc coordinate mainMap addAnnot
  • Eclipse kepler - 禁用 javascript 验证

    我刚刚安装了新的 eclipse kepler eclipse 4 3 它向我显示了来自第三方 javascript 库的数百个错误和警告 我尝试通过取消选中 首选项 JavaScript 验证器 中的 启用 JavaScript 语义验证
  • ptrdiff_t 太小?

    我一直想知道 不是吗ptrdiff t应该能够保存任意两个指针的差异根据定义 为什么当两个指针距离太远时会失败 我不是指任何特定的语言 我指的是具有这种类型的所有语言 例如 用地址减去指针1从带有地址的字节指针0xFFFFFFFF当你有 3
  • 在 AWS AMI Linux 服务器上设置 Supervisord [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在努力让主管工作以确保我的队列系统始终运行 以下是我从各种来源拼凑而成的步骤 以 root 或超级用户身份运行 1 easy inst
  • Postgres 时间戳

    我们正在争论在 postgres 中存储时间戳的最佳方式 目前 所有时间戳都存储为 00 并且我们有一个与每个客户端关联的时区 我们查找时区并转换发生某事的时间 这增加了复杂性 因为我们需要进行更多的连接和更复杂的查询 另一种方法是连接到