【问题标题】:Using Hibernate HQL to select records where two dates are within a specified interval使用 Hibernate HQL 选择两个日期在指定间隔内的记录
【发布时间】:2010-11-14 19:08:48
【问题描述】:

我正在尝试使用 HQL 查找两个日期字段在 1 个月内的记录。

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

不幸的是,使用的数据库显然不理解间隔。

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

【问题讨论】:

    标签: hibernate timestamp hql date intervals


    【解决方案1】:

    必须是日历月吗?恐怕在这种情况下没有好的 HQL-only 解决方案。你能得到的最接近的是:

    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 是上个月的最后一天和 @987654324 的情况@ 是下个月的第一天,它们之间的月份少于 31 天。
    如果需要,您可以进一步延长此时间以处理时间。但是,最终,您最好获得近似结果并在代码中进一步重新检查/过滤它们。

    【讨论】:

    • 非常好,这似乎可以满足我的需求。它是一个运行在 MS SQLServer 上的 Rational ClearQuest 数据库。但我希望保持它的数据库中立,并更加熟悉 HQL。谢谢!
    • 如果理解正确,要求是在两个日期的“一个月内”......使用像 31 这样的值不会准确工作,因为某些(公历)月份有 28 - 31 天。此外,根据一天中的时间,还有更多可能会关闭。
    【解决方案2】:

    唉,JPQL 还没有完全实现。要准确比较两个日期字段,需要查询以将相关实体纳入日期(DATE 或 TIMESTAMP)Java/JPA 对象类型,然后比较它们(建议使用 Java Calendar 或 JodaTime)日历类。在那里,从其中一个日历中减去一个月,然后比较两者之间的差异(以天、小时等为单位)将产生准确的结果。请参阅 Java Calendar.add() 和 Calendar.before() 或 after() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2017-07-15
      相关资源
      最近更新 更多