gpt4 book ai didi

PostgreSQL/JDBC 和 TIMESTAMP 与 TIMESTAMPTZ

转载 作者:行者123 更新时间:2023-11-29 11:10:58 24 4
gpt4 key购买 nike

我最近在使用 JPA 处理时间戳时遇到了很多痛苦。我发现通过在我的字段中使用 TIMESTAMPTZ 而不是 TIMESTAMP,我的很多问题都得到了解决。我的服务器使用 UTC,而我的 JVM 使用 PST。当使用 TIMESTAMP WITHOUT TIMEZONE 时,JPA 似乎几乎不可能规范化数据库中的 UTC 值。

对我来说,我将这些字段用于诸如“用户何时创建”、“他们最后一次使用他们的设备是什么时候”、“他们最后一次收到警报是什么时候”等内容。这些通常是事件,因此他们是时间类型的值的实例。因为他们现在将通过 TIMESTAMPTZ 如果我不想要他们 UTC,我总是可以查询他们的特定区域。

所以我的问题是,对于 Java/JPA/PostgreSQL 服务器,我什么时候想使用 TIMESTAMP 而不是 TIMESTAMPTZ?它有哪些用例?现在我很难理解为什么我想要使用 TIMESTAMP 并且因此我担心我没有掌握它的值(value)。

最佳答案

一般使用TIMESTAMPTZ

以下是 Postgres 专家 David E. Wheeler 在博客文章中的建议,其标题说明了一切:
Always Use TIMESTAMP WITH TIME ZONE (TIMESTAMPTZ)

如果您要跟踪实际时刻,时间轴上的特定点,请使用 TIMESTAMP WITH TIME ZONE

一个异常(exception):分区

Wheeler 的唯一异常(exception)是由于技术限制在时间戳上进行分区时。对于我们大多数人来说,这是一个罕见的异常(exception)

有关分区的信息,请参阅 doc并查看 Wiki .

用词不当

数据类型名称 timestamp with time zonetimestamp without time zone 是用词不当。在两种情况下,日期时间值都以 UTC 格式存储(无时区偏移)。再读一遍上一句。 UTC,始终。“with time zone”短语的意思是“注意时区”,而不是“将时区与该值一起存储”。类型之间的区别在于是否应在存储(INSERT 或 UPDATE)或检索(SELECT 查询)期间应用任何时区。 (针对 Postgres 描述了这种行为——其他数据库在这方面广泛。)

更准确地说,应该说 TIMESTAMP WITHOUT TIME ZONE 存储没有时区的日期时间值。但如果没有任何时间框架引用,任何查看该数据的人都必须假设(希望,祈祷?)这些值是 UTC。但同样,没有实际意义,因为您几乎不应该使用这种类型。

阅读the doc仔细地做一些实验来澄清你的理解。

未分区

如果您想存储可能时间的一般概念而不是特定时刻,请使用另一种类型,TIMESTAMP WITHOUT TIME ZONE

例如,今年的圣诞节从 2017 年 12 月 25 日的第一刻开始。那将是 2017-12-25T
00:00:00
没有时区指示符,也没有与 UTC 的偏移量。这个值只是关于可能时刻的一个模糊概念。在我们应用时区(或偏移量)之前它没有任何意义。所以我们使用 TIMESTAMP WITHOUT TIME ZONE 来存储它。

在圣诞老人的特殊事件后勤部门工作的小 Sprite 将时区作为他们计划过程的一部分。目前最早的时区是Pacific/Kiribati , 比 UTC 时间早 14 小时。 Sprite 们安排圣诞老人第一次到达那里。 Sprite 们安排了一个飞行计划,将驯鹿带到午夜过后不久的其他时区,例如 Pacific/Auckland。随着每个区域的午夜到来,他们继续向西行驶。几小时后在 Asia/Kolkata,再晚一点在 Europe/Paris,再过几个小时在 America/Montreal 等等。

Sprite 们会使用 WITH TIME ZONE 记录每个特定的交付时刻,而圣诞节的一般概念将存储为 WITHOUT TIME ZONE

WITHOUT TIME ZONE 在商业应用中的另一个用途是安排几周以外的约会。世界各地的政治家都有一种莫名其妙的偏爱,即扰乱时钟和重新定义时区规则。他们加入夏令时 (DST)、离开 DST、在不同的日期开始 DST、或在不同的日期结束 DST,或者将时钟调整 15 分钟或半小时。所有这些都是在过去几年中由土耳其、美国、俄罗斯、委内瑞拉和其他国家完成的。

政客们经常在没有预先警告的情况下做出这些改变。因此,如果您在 13:00 安排六个月的 dentry 预约,则可能应该将其存储为 TIMESTAMP WITHOUT TIME ZONE 否则政客们可能会有效地将您的预约更改为中午或下午 2 点, 或 13:30。

关于PostgreSQL/JDBC 和 TIMESTAMP 与 TIMESTAMPTZ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22922155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com