在使用mybatis
传入日期参数
进行动态时间判断的时候,
如果传入参数为String
, 使用mybatis
时, 在mapper
中以下几种写法是错误的
<if test="query.beginDate != null and query.endDate != ''" >
AND ccf.last_update_timestamp between #{query.beginDate} AND #{query.endDate}
</if>
<if test="query.beginDate != null and query.endDate != ''" >
AND ccf.last_update_timestamp between TIMESTAMP #{query.beginDate} AND TIMESTAMP #{query.endDate}
</if>
<if test="query.beginDate != null and query.endDate != ''" >
AND ccf.last_update_timestamp between TIMESTAMP ${query.beginDate} AND TIMESTAMP ${query.endDate}
</if>
我们看到, 直接在可视化工具里用SQL写
ccf.last_update_timestamp between TIMESTAMP '2019-12-13' AND TIMESTAMP '2019-12-13'
甚至去掉 TIMESTAMP 都是可以的, pgSQL可以自动把字符串给你转换成日期格式, 然后作比较
但是在mapper文件中这么写就不可以了, 它会提示你varchar类型不能和日期类型进行比较
正确的做法是使用DATE()
函数把字符串手动转换成日期
<if test="query.beginDate != null and query.endDate != ''" >
AND ccf.last_update_timestamp between DATE(#{query.beginDate}) AND DATE(#{query.endDate})
</if>
相应地, 如果传入的参数不是一个yyyy-MM-dd的日期格式, 而是一个yyyy-MM-dd HH:mm:ss的格式则是使用TO_TIMESTAMP()
函数
<if test="query.beginDate != null and query.endDate != ''" >
AND ccf.last_update_timestamp between TO_TIMESTAMP(#{query.beginDate},'yyyy-MM-dd hh24:mi:ss') AND TO_TIMESTAMP(#{query.endDate},'yyyy-MM-dd hh24:mi:ss)
</if>
来自 <https://gitee.com/macro_joe/codes/5exhwivrpdkfb7t69yaj149>