在使用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>

posted on 2023-03-07 09:15  一贯可乐  阅读(1076)  评论(0编辑  收藏  举报



123