我在寻找如何在HQL查询中执行日期/时间数学。具体来说,如何添加或从current_timestamp()函数的结果减去(X)的时间?还是我拖放到SQL,这和希望任何数据库正在运行支持呢?

HQL查询的示例:

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

我可以定义:timeToSubtract参数为任何特定的单元,虽然任何比小时更大是不希望的,并且秒将是最期望的

澄清:我明白,这可以在查询的外部容易地完成。但是,对于哲学的原因,我们说要使用的数据库服务器的时间,而不是查询系统的时间是很重要的。实例:我查询的时间过去(x)的额度内的所有条目自动时间戳。由于时间戳是由数据库系统进行,重要的是还使用数据库的当前时间。

有帮助吗?

解决方案

如果您需要的数据库服务器的时间,你可以先做一个简单的HQL查询来获取时间戳,然后在Java计算maxTimestamp,并通过所获取的时间戳和计算maxTimeStamp像ccclark的一个查询。

其他提示

为什么你需要做的是在查询?为什么不直接处理它在Java代码中。

例如:

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

和然后只设置的参数。

您可以决定的语法做使用SQL在数据库中,然后定义自定义HibernateDialect内的功能。例如,我们需要一个工作日的函数,而不是标准的SQL。我们子类为每个数据库方言,然后加入这样的行:

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

在你的情况,你可以使用一个名为date_diff可能被定义为功能? - ?在一些数据库或东西别人不一样。你不必这样写原始的SQL查询中,如果你在任何时候需要切换数据库,你只是在你的方言不同方式映射功能。

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

Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top