为什么我不能将java.util.Date与mysql日期进行比较?

时间:2011-10-28 11:46:16

标签: java mysql hibernate date jpa

我有一个奇怪的情况:

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

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)

但是,如果我将日期参数i设置为java.sql.Date(),它就可以了!

现在,鉴于我的mySql DB列是Date,而不是DateTime,这不是一个错误吗?即使我发送java.util.date,它不应该只比较日期部分,因为我的数据库列是一个日期?

编辑:我尝试使用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);

所以从我所看到的,我将时间部分设置为0也为sql-dates,除非我使用已弃用的“year-month-date”构造函数...

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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