2011-10-28 72 views
3

我有一个奇怪的现象:为什么我不能将java.util.Date与mysql日期进行比较?

我使用JPA /休眠从MySQL数据库表,其中一个日期列是大于或等于我发送的日期得到行(去掉了不相关的代码):

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

在我的代码我基本上做到:

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

现在,我的问题是,当在DB的日期是同一天。即“今天”,它不会被拾起。我认为这是因为它不知何故也将java.util.date的时间部分与数据库中的内容进行比较(db值仅为“2011-10-28”,但java.util Date为2011-10-28T13:36 :43.130 + 0200)

不过,如果我更改日期参数i设置成java.sql.Date(),它的工作原理

。现在,因为我的MySQL数据库列是一个日期,而不是!一个日期时间,这是一个错误?即使我发送一个java.util.date,不应该只比较日期部分,因为我的数据库列是日期吗?

编辑:我试过使用util日期并将其转换为一个sql日期,但实际上并不起作用:

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

因此,从我所看到的,我的部分时间设置为0,也为SQL的日期,除非我用的是过时“年 - 月 - 日”构造...

+0

不,这不是一个错误。 2011-10-28不是> = 2011-10-28T13:36:43.130 + 0200。你的日期对象有2011-10-28T13:36:43.130 + 0200,因此失败。然而,java.sql.Date只存储日/月/年,或者只是在你调用toString()时返回,所以它等于2011-10-28。 – Thor84no

+0

嘿,感谢您的输入。看到我上面的编辑评论,并说出你认为队友 – Mathias

回答

3

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

+0

是的,谢谢,我结束了使用jodatime的DateMidnight ... – Mathias

1

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

+0

顺便说一句。 java.sql.Date extends java.util.Date – stacker

+0

Mark,谢谢你的想法。然而,我用sql-dates的主要牛肉是任何“全日制”构造函数,即年份 - 月份日期,已被弃用。你应该基本上使用长构造函数,然后我可以使用JodaTime“datemidnight”来代替......你有更好的主意吗? – Mathias

+0

堆栈器,马克,请看我上面的编辑... – Mathias

相关问题