我正在尝试获取最近 "N" 个月的订单。在以下查询中,我需要动态设置月份的值

I am trying to fetch orders for last "N" months. In the following query I need to dynamically set the value for months

我在设置月值时遇到 java 异常:

SELECT * 
  FROM {Order} 
 WHERE creationtime >= NOW() 
   AND creationtime <= DATE_SUB(NOW(),  INTERVAL ?months MONTH)

但是此查询在 mysql 中正常工作。

预期跟踪:

错误 [hybrisHTTP34] [FlexibleSearch] 发生灵活搜索错误... 2017 年 5 月 8 日 1:53:18 下午 org.apache.catalina.core.StandardWrapperValve 调用 严重:Servlet.service() for servlet [DispatcherServlet] 在路径 [/jafrastorefront] 上下文中抛出异常 [请求处理失败;嵌套异常是 de.hybris.platform.servicelayer.search.exceptions.FlexibleSearchException: SQL 搜索错误 - 启用 属性 'flexible.search.exception.show.query.details' 以获得更多详细信息] 与根本原因 org.hsqldb.HsqlException:意外标记:?

不确定 java 异常,但逻辑上,你的代码有这个问题。

如果NOW()5th MayDATE_SUB(NOW(),INTERVAL 1 MONTH)将是5th April,所以你同时选择记录> 5th May< 5th April时间。因此你不会得到任何结果。

使用between避免混淆,使用BETWEEN.

SELECT * FROM {Order} 
WHERE creationtime BETWEEN
   DATE_SUB(NOW(),  INTERVAL 1 MONTH )
AND   
   NOW()

如果您想获取最近 'N' 个月的数据,您可以直接使用以下查询。

where creationtime>= ( CURDATE() - INTERVAL 1 month) 

在 java 以下应该有效。

SELECT * 
  FROM {Order} 
 WHERE creationtime>= ( CURDATE() - INTERVAL ? month) 

HSQLDB SQL语法是

SELECT * FROM "Order"
WHERE creationtime >= NOW() - CAST(? AS INTERVAL MONTH)