我应该将时区与 Postgres 和 JDBC 的时间戳分开存储吗?

2023-11-24

看起来(也许我是错的)如果你想保留 JDBC 和 Postgres 发生问题时的时区,你需要将时区与时间戳分开存储。

也就是说我更愿意给我的 ORM/JDBC/JPA 一个 JavaCalendar(或乔达DataTime)与说时区America/New_York到 Postgrestimestampz场地。而且我希望在检索时,无论服务器时区(或默认为 UTC)如何,都会给我返回一个Calendar与时区America/New_York。但只要看看大多数 JDBC 代码(以及依赖它的事情就不会发生)。

它是否正确?

当 postgres 支持时,我需要将 tz 存储在另一个字段中,这似乎很荒谬。

因此,似乎唯一的两个选择是:

  1. 选择timestampzPostgres 列作为java.util.String并解析它。
  2. 将时区存储为单独的字段。

选项一和二一将需要某种类型的转换拦截器来用于我的 SQL 映射/ORM 库。

  • JDBC 的最佳解决方案是什么?
  • JPA 的最佳解决方案是什么(如果与 JDBC 不同)?

当您存储一个timestamp with time zone (timestamptz) 它被转换为 UTC 以存储在数据库中。检索时,它会转换为客户端当前的时区,而不是它原来所在的时区。基本上,它是一个时间点。

还有timestamp without time zone (timestamp)。这不受转换影响,但会not带有时间戳。如果您存储一个timestamp将您的客户端时区设置为 UTC,然后在客户端时区为“+08:00”时检索它,您会得到相同的值。这就是您想要的一半,因为它保留了原始时间价值。

这些名称和行为非常糟糕且令人困惑,但它们是由 SQL 标准设置的。

如果您希望记录特定时区的时间点,则必须单独存储时区。我建议将其存储为INTERVAL with a CHECK约束将其限制为colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR。该定义拒绝 -12:00 并接受 +12:00;我不完全确定这是正确的,所以检查一下。

您可以存储timestamp那个时区的当地时间(我可能会做的),或者存储timestamptz事件发生时的 UTC 时间加上可让您将其转换为本地时间的偏移量。

对于 JDBC 来说,两者都可以正常工作。对于 JPA,这取决于您的提供商对间隔类型的理解和映射程度。理想情况下,您希望实体中有一个瞬态生成的字段,该字段可以使用以下方法重建您想要的日历实例:timestamp and interval存储在数据库中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该将时区与 Postgres 和 JDBC 的时间戳分开存储吗? 的相关文章

随机推荐

  • HTML 将 WebGL Canvas 保存为图像

    我在用https github com auduno clmtrackr 我试图从以下示例中保存图像 https github com auduno clmtrackr blob dev examples facedeform html 问
  • 在客户端访问数据库就像在服务器端使用meteor一样

    我在文档中读到了这个 数据库无处不在 使用相同的透明 API 来访问您的 来自客户端或服务器的数据库 这很棒 但我认为存在一些安全问题 在客户端提供对数据库的完全透明的访问 您会遇到不良用户 他们会修改您的 JS 代码 实际上是在他的浏览器
  • svcutil.exe - 生成的代理不允许可空字段

    我试图通过使用 svcutil exe 创建 WCF 代理来使用使用 WSDL 指定的 Web 服务 但 WSDL 指定某些操作具有可选参数 minOccurs 0 例如
  • 从非托管 C++ 应用程序调用 C# dll,无需 COM

    有没有办法在不使用 COM 的情况下从 C 非托管应用程序调用 C DLL 您可以使用以下方法执行此操作Reverse P Invoke 示例和讨论here
  • ReSharper 6.1 是否可以与 Visual Studio 2012 配合使用?

    Resharper 6 1 支持 Visual Studio 2012 吗 我可以在 VS2010 上使用它 但想知道我是否需要升级到 ReSharper 7 0 以获得 VS2012 的支持 如果我这么做的话 我会很失望 捷脑公司承认虽然
  • bootstrap 3 到 bootstrap 4 列不再水平对齐[重复]

    这个问题在这里已经有答案了 我正在迁移到 bootstrap 4 但是我已将页面的 bootstrap min css 从 3 交换到 4 并且我的列现在全部垂直对齐 据我所知 列是正确的 我还使用 JS 小提琴进行测试 并且能够将它们全部
  • 对模板中的对象进行排序

    让这些模型 class Category models Model name models CharField max length 20 class Word models Model name models CharField max
  • R 使用 XML 数据时出现“externalptr”错误

    我正在 R 中处理一些 XML 数据 并遇到了有关 externalptr 类型的错误 1 当我尝试使用 xmlInternalTreeParse 函数 XML 包的一部分 时 出现以下错误 doc xmlInternalTreeParse
  • Magento:以编程方式添加新产品

    我正在尝试以编程方式将产品添加到 Magento 1 5 我的脚本最终将是一个 cron 作业 按照帐户系统提供的 XML 文件的指示定期更新和添加产品 我在创造新产品时遇到问题 我的脚本中的相关代码段是 attributeSetId 4
  • 将数组写入范围。只获取数组的第一个值

    我正在尝试将数组写入一个范围 并且尝试了多种方法 但无论如何 我总是一遍又一遍地只获得数组的第一个值 这是代码 Option Explicit Sub test ActiveWorkbook Worksheets Sheet1 Cells
  • 密集和稀疏矩阵的高效(时间和空间复杂度)数据结构

    我必须读取一个文件 其中存储了一个包含汽车的矩阵 1 蓝色汽车 2 红色汽车 0 空车 我需要编写一个算法来移动汽车矩阵的这种方式 蓝色的会动downward 红色的移动向右 有一个turn其中所有蓝色的都移动 然后轮流移动所有红色的 在读
  • Python:找到最小元素的最后一个索引?

    例如 1 2 3 4 1 2 具有最小元素 1 但它最后一次出现在索引 4 处 gt gt gt values 1 2 3 4 1 2 gt gt gt min x i for i x in enumerate values 1 4 无需修
  • 使用 OR 运算符检查变量值

    因此 我团队中的一位初级程序员今天编写了以下代码 if status incomplete unknown 这显然不会达到他的预期 即 if status incomplete status unknown 但我无法解释的是为什么第一段代码
  • 具有单一方法的类——最好的方法?

    假设我有一个旨在执行单个功能的类 执行完该功能后 就可以将其销毁 有什么理由选择其中一种方法吗 Initialize arguments in constructor MyClass myObject new MyClass arg1 ar
  • 在存档中安装 R 包

    如何在 Windows 中安装存档的软件包 http cran r project org src contrib Archive 当我尝试安装从存档下载的 tar gz 时 出现以下错误 Error in gzfile file r ca
  • Firestore 安全规则中的递归通配符未按预期工作

    我有一个像这样的数据结构 收藏 and 文件而不是JSON当然 但你明白了 users user1 name Alice groups groupA subbed true groupB subbed true user2 name Bob
  • Valums 文件上传器在 Internet Explorer 9 下不起作用

    Values 文件上传器 现在称为精美上传者 在 Internet Explorer 9 下不起作用 但在 Chrome 下工作得很好 因此 在 IE 下 它会显示文件名和取消按钮 并且不会显示上传百分比 有什么线索吗 更新 解决方案也在这
  • 从网络中的另一台机器 Ping Docker 容器

    我创建了一个 docker 容器 并尝试在容器的 bash 中 ping www google com 并且它有效 我还尝试从主机 ping 容器 它工作得很好 但是 当我尝试从网络中的外部系统 ping 容器时 它给了我一个请求超时异常
  • CakePHP 从数据库中查询最近的纬度经度

    在 CakePHP v3 应用程序中 如何根据传递的 lat lng 值检索最接近的结果 我想让它们恢复为原生 CakePHP 实体 所以像这样 public function closest lat lng sightings recor
  • 我应该将时区与 Postgres 和 JDBC 的时间戳分开存储吗?

    看起来 也许我是错的 如果你想保留 JDBC 和 Postgres 发生问题时的时区 你需要将时区与时间戳分开存储 也就是说我更愿意给我的 ORM JDBC JPA 一个 JavaCalendar 或乔达DataTime 与说时区Ameri