使用Hibernate HQL选择记录,其中两个日期在指定的时间间隔内

问题描述:

我试图使用HQL来查找两个日期字段在彼此的1个月内的记录。使用Hibernate HQL选择记录,其中两个日期在指定的时间间隔内

Query query = session.createQuery("from com.ep.cqprojects.db.Projects " 
    + "where active_date - kickoff_meeting_date < interval '1' month "); 

不幸的是,使用的数据库显然不明白区间。

如何比较两个日期字段之间的时间间隔?

它是否必须是一个日历月?恐怕在这种情况下没有好的HQL解决方案。你可以得到的最接近的事是:

from com.ep.cqprojects.db.Projects 
where active_date - kickoff_meeting_date < 31 
    and month(active_date) - month(kickoff_meeting_date) < 2 

month()是ANSI SQL功能,所以希望应由数据库引擎的支持(顺便说一下,什么数据库是什么?)第二个条件是需要淘汰的情况下active_date是上个月的最后一天和kickoff_meeting_date是下个月的第一天,月份之间的月差不超过31天。
如果需要,您可以进一步扩展以处理时间。但是,最终你可能会更好地获得近似结果,并在代码中进一步重新检查/过滤它们。

+0

非常好,这似乎对我的需求很好。它是在MS SQLServer上运行的Rational ClearQuest数据库。但是我希望保持它与数据库的中立性并且更熟悉HQL。谢谢! – Richard 2009-07-28 22:38:06

+0

如果理解正确,要求是在两个日期的“一个月内”...使用像31这样的值不会准确地工作,因为一些(格里高利日历)月有28 - 31天。而且,根据每日时间的不同,还有更多潜力可以消失。 – 2013-03-27 20:44:34

唉,JPQL还没到那儿呢。为了准确地比较两个日期字段,需要查询将有问题的实体带入日期(DATE或TIMESTAMP)Java/JPA对象类型,然后比较它们(推荐使用Java日历或JodaTime)日历类。一旦出现,从一个日历中减去一个月,然后比较两者之间的差异(以天,小时等)将得出一个准确的结果。请参阅Java Calendar.add()和Calendar.before()或after()方法。