在HQL中执行日期/时间数学?

时间:2009-03-12 16:55:29

标签: hibernate datetime hql

我正在寻找如何在HQL查询中执行日期/时间数学运算。具体来说,如何从current_timestamp()函数的结果中添加或减去(x)时间量?或者我是否必须为此插入SQL并希望运行的数据库支持它?

HQL查询示例:

FROM RandomThing
WHERE randomTime IS NOT NULL AND
      randomTime >= current_timestamp() AND
      randomTime <= (current_timestamp() + :timeToAdd)

我可以将:timeToSubtract参数定义为任何特定单位,但任何大于小时的内容都是不合需要的,并且秒是最理想的。

澄清:我意识到这可以在查询之外轻松完成。但是出于哲学原因,让我们说使用数据库服务器的时间非常重要,而不是查询系统的时间。实际示例:我正在查询最后(x)时间内所有条目的自动时间戳。由于时间戳是由数据库系统生成的,因此使用数据库的当前时间也很重要。

4 个答案:

答案 0 :(得分:10)

为什么需要在查询中执行此操作?为什么不在java代码中处理它。

例如:

From RandomThing
Where randomTime is not null and
      randomTime >= :currentTimestamp and
      randomTime <= :maxTimestamp

然后只需设置参数。

答案 1 :(得分:4)

您可以确定在数据库中使用SQL执行此操作的语法,然后在自定义HibernateDialect中定义函数。例如,我们需要一个不是标准SQL的工作日函数。我们为每个数据库分类了方言,然后添加了这样一行:

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );

在你的情况下,你可以使用一个名为date_diff的函数,它可能被定义为? - ?在一些数据库或其他数据库中的不同这样您就不必在查询中编写原始SQL,如果您需要切换数据库,只需在方言中以不同方式映射函数。

答案 2 :(得分:3)

如果你需要数据库服务器的时间,你可以先做一个简单的hql查询来获取时间戳,然后计算java中的maxTimestamp,并将获取的时间戳和计算出的maxTimeStamp传递给类似ccclark的查询。

答案 3 :(得分:1)

是否必须是HQL?我可能会切换到休眠标准并使用:

Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )