没有时间戳的 HQL 中的日期比较

Posted

技术标签:

【中文标题】没有时间戳的 HQL 中的日期比较【英文标题】:Date Compare in HQL without timestamp 【发布时间】:2014-10-30 01:46:57 【问题描述】:

我必须在 hibernate hql 查询中比较两个日期。 我在我的 java bean 中使用 java.util.Date 并在 mysql 数据库中使用时间戳作为数据类型。

select t from Task t where t.modifiedDate > t.endDate;

以上查询将时间与日期进行比较。我应该怎么做才能在没有时间的情况下比较上述查询中的日期。

【问题讨论】:

【参考方案1】:

date() 函数的建议解决方案似乎不是纯 SQL,对我不起作用(使用 SQL Server)。最初的解决方案(分别比较日、月和年)是朝着正确方向迈出的一步,但不能以这种方式完成,例如,对于未来的日期,如果月更大,等等。但是,以下 SQL 应该可以工作:

( year(t.endDate) > year(t.startDate) )
or 
( year(t.endDate) = year(t.startDate) 
  and 
  month(t.endDate) > month(t.startDate) )
or 
( year(t.endDate) = year(t.startDate) 
  and
  month(t.endDate) = month(t.startDate) 
  and
  day(t.endDate) > day(t.startDate) )

【讨论】:

【参考方案2】:

查看 Hibernate 文档了解可用的日期函数

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

在第 14.10 节中注意这一行

second(...), minute(...), hour(...), day(...), month(...), and year(...)

所以这应该可以工作

... where year(t.endDate) > year(t.startDate) 
    and month(t.endDate) > month(t.startDate)
    and day(t.endDate) > day(t.startDate)

报告为满足问题的解决方案是

 ... where DATE(t.endDate) > (t.startDate)

【讨论】:

这给了我分别与月份和年份的比较......但我必须像 06-09-2014 这样的时间比较完整日期 b> 它适用于以下更改 where DATE(t.endDate) > (t.startDate) 很高兴它对你有用。我正在使用您的解决方案编辑答案,而不是将解决方案留在 cmets 中。这就是 *** 的做事方式。 如果我们需要将日期作为名称参数而不是 t.startDate,那么查询将类似于 Date(t.endDate) @carbontax 是否允许在 hql 查询中使用“where DATE(t.endDate) > DATE(:currentDate)”。即使用带输入参数的 DATE()??

以上是关于没有时间戳的 HQL 中的日期比较的主要内容,如果未能解决你的问题,请参考以下文章

Java程序获取没有时间戳的当前日期

hql日期和字符串的比较

比较jpa中的日期

比较C中两个文件的日期和时间[关闭]

如何在 SQL Select 语句中仅比较日期(无时间戳)

IBM iSeries 结合日期和时间十进制字段来比较当前时间