查询近一个月总数sql,mapper如下:
<select id="countMonthExp" parameterType="com.hky.domain.Experience"
resultType="java.lang.Integer">
select
COUNT(1)
from TB_EXPERIENCE exp
where exp.creatdate>DATE_SUB(CURDATE(), interval 1 MONTH)
and exp.cstatus = 1
</select>
报错信息如下:
dastudy- 2021-03-22 17:30:29 [http-nio-8000-exec-5] ERROR c.a.druid.filter.stat.StatFilter - merge sql error, dbType com.alibaba.druid.pool.DruidDataSource, druid-1.1.22, sql : select
COUNT(1) res
from TB_EXPERIENCE exp
where exp.creatdate>DATE_SUB(CURDATE(), interval 1 MONTH)
and exp.cstatus = 1
com.alibaba.druid.sql.parser.ParserException: TODO. pos 97, line 4, column 43, token INTERVAL
如果interval加反单引号,依旧会报错,提示sql错了。
换种写法传个值过来,可以解决,但是想知道如果想要用这个关键字,要怎么做呢?
看报错是 Duird 的 StatFilter - merge sql 时出错了,可以在配置里把 statFilter 的 mergeSql 功能关掉, 参考官方文档:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
其中的 【4. SQL合并配置】 部分介绍:
<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
<property name="mergeSql" value="false" />
</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
... ...
<property name="proxyFilters">
<list>
<ref bean="stat-filter" />
</list>
</property>
</bean>
在mybatis中 ">" 是属于特殊字符的,需要转义一下,可以使用 > 来表示>
SELECT COUNT(*)
FROM X AS t1
WHERE X.start_time > DATE_SUB(CURDATE(),INTERVAL 6 MONTH)
我对比了你的写法,写法没问题,考虑可能是你MySQL版本的问题。
你说的传值是CURDATE()吗?如果是的话换成NOW()试试。