【问题标题】:Why can't i compare java.util.Date to mysql dates?为什么我不能将 java.util.Date 与 mysql 日期进行比较?
【发布时间】:2011-12-17 05:53:31
【问题描述】:

我遇到了一个奇怪的情况:

我正在使用 jpa/hibernate 从 mySql DB 表中获取行,其中日期列大于或等于我发送的日期(删除了不相关的代码):

SELECT sp.* FROM spaceproduct sp where sp.enddate is null or sp.enddate >= :endDate)

在我的代码中我基本上是这样做的:

q.setParameter("endDate", new java.util.Date());

现在,我的问题是数据库中的日期是同一日期。即“今天”,它不会被拾取。我认为这是因为它以某种方式还将 java.util.date 的时间部分与数据库中的时间部分进行了比较(db 值仅为“2011-10-28”,但 java.util 日期为 2011-10-28T13:36 :43.130+0200)

但是,如果我将设置的日期参数更改为 java.sql.Date(),它会起作用!

现在,鉴于我的 mySql DB 列是日期,而不是日期时间,这不是错误吗?即使我发送了 java.util.date,它不应该只比较日期部分,因为我的 DB 列是日期吗?

编辑:我尝试使用 util-date 并将其转换为 sql-date。这实际上也不起作用:

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
q.setParameter("endDate", sqlDate);

所以据我所知,我 也将 sql-dates 的时间部分设置为 0,除非我使用已弃用的“年-月-日”构造函数... p>

【问题讨论】:

  • 不,这不是错误。 2011-10-28 不 >= 2011-10-28T13:36:43.130+0200。您的日期对象有 2011-10-28T13:36:43.130+0200,因此它失败了。然而,java.sql.Date 只存储日/月/年,或者更确切地说,它只在您调用 toString() 时返回,所以它等于 2011-10-28。
  • 您好,感谢您的意见。看看我上面的编辑评论,说出你的想法

标签: java mysql hibernate date jpa


【解决方案1】:

您应该使用 java.sql.Date,因为它纯粹是一个日期,不包含时间信息。 它与 java.util.Date 一起使用的原因是数据库或 JDBC 驱动程序将列从 DATE 扩大到 TIMESTAMP(具有 00:00:00 时间部分)以使比较与参数一起工作。

【讨论】:

  • 顺便说一句。 java.sql.Date 扩展 java.util.Date
  • 马克,谢谢你的想法。但是,我对 sql-dates 的主要不满是任何“日期范围”的构造函数,即年-月-日,都已被弃用。你基本上应该使用long-constructor,然后我还不如使用JodaTime“datemidnight”来代替......你有更好的主意吗?
  • 好的,那我猜这是 Connector/J 驱动程序中的一个错误,因为我刚刚注意到实际上是 JDBC 驱动程序负责将 java.sql.Date 转换为等效的 DATE (所以没有时间部分)。您可以尝试使用 java.sql.Date.toString() 和 setString 作为解决方法。
【解决方案2】:

您可以使用System.currentTimeMillis() 而不是创建实用程序Date 来获得这么长的时间。但是,我希望您编辑的代码可以工作,但是如果没有,您别无选择,只能以某种方式丢弃小时/分钟/秒/毫秒,例如 System.currentTimeMillis() % 24 * 60 * 60 * 1000 (当然最好将其存储在常量中,但它得到了重点)。或者你可以只使用 Joda。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多