gpt4 book ai didi

java - 不带时区的 PostgreSQL 时间戳与带时区的 java.util.Date 的比较

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:07:47 29 4
gpt4 key购买 nike

我想知道如何执行以下查询中的比较:

StringBuilder queryStr = new StringBuilder();
queryStr.append("SELECT o FROM PRDBook as o WHERE ")
.append("o.publicationDate < :now");

Query query = entityManager.createQuery(queryStr.toString());
Date now = new Date();
query.setParameter("now", now);

在数据库中,publicationDate 列的类型是timestamp without time zone。此列中的示例值:

2018-03-01 18:00:00

now.toString() 的结果是:

Wed Aug 22 16:14:03 CEST 2018

是否会以这种方式执行上述数据之间的比较:

2018-03-01 18:00:00 < 2018-08-22 16:14:03

或者那样:

2018-03-01 18:00:00 < 2018-08-22 14:14:03

最佳答案

有趣的问题。

当 PostgreSQL 的 JDBC 驱动程序读取类型为 timestamp without time zone 的列时,它通常可以将其读取到 java.sql.Timestampjava.util .日期.

如果您选择将其读取到 java.util.Date(您的情况),PostgreSQL 的 JDBC 驱动程序会自动将本地 JVM 时区添加到其中。这是有道理的,因为 timestamp without time zone 类型的列的整个点将被视为“本地”时间戳。

相反,当您将 java.util.Date 发送到数据库时,它会立即删除时区。因此查询条件将采用以下形式:

2018-03-01 18:00:00 < 2018-08-22 16:14:03

顺便说一下,这意味着建议您显式设置 JVM 时区,以确保 JDBC 驱动程序正在将数据库没有时区的时间戳重组为 java.util.Date 正确的方法。

否则,不同时区的不同服务器读取同一数据库中的相同行时,会将时间戳解释为不同的时刻。尽管如此,对于使用“本地”时间戳的应用程序来说,这可能不是一个有效的用例。

关于java - 不带时区的 PostgreSQL 时间戳与带时区的 java.util.Date 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51969241/

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