• Mybatis中如何查询时间段内的数据


    最后一个是正确的,前边的三个是可能遇到的坑,给大家展示一下,如果不需要的,可以直接跳到最后看:

    有时候我们需要查询一张表内一段时间内操作的数据,大家很容易就想到了 between ? and ? 这个 句型的sql 对不对? ,如果现在需要两个参数(比如一个开始日期,一个结束日期)来传递,需求是选择一个参数或者两个参数都可以查询,但是如下边这个条件判断使用and连接,此时需要两个参数都要有,才会有查询结果,当其中有一个日期参数为空的时候,这个sql就不会被执行,必须要两个参数才可以查询,这与我们的需求不符合,所以不可取,

     <if test="beginDate != null and beginDate != '' and endDate != null and endDate != ''">
                stock_bill.bill_date between #{beginDate} and #{endDate}
     </if>

    现在我们将其中的两个条件之间的and 改为or试一试

     <if test="beginDate != null and beginDate != '' or endDate != null and endDate != ''">
              AND stock_bill.bill_date between #{beginDate} and #{endDate}
     </if>

    此时如果输入两个日期参数同样可以查询到对应的数据,但是如果只输入一个开始日期参数,此时查询结果为空,通过打印sql,我们可以看到只有一个开始日期,没有结束日期,between ? and ? 的两个日期参数不完整,一个参数为空,所以这个sql 就发生了错误,这显然与我们的初衷不符合,所以这个方法也不可取,打印sql如下:

    看来想要通过一个参数就可以查询到对应的数据,使用between?and ?是不行的,我只好放弃了between? and? ,而把他们都拆开来。代码如下:

    <if test="beginDate != null and beginDate != ''"> AND stock_bill.bill_date >= #{beginDate}</if>
    <if test="endDate != null and endDate != ''">AND stock_bill.bill_date <= #{endDate}</if>

    此时的我又遇到了另外的坑,报错信息如下

    The content of elements must consist of well-formed character data or markup. 这个错误是说我的><号不符合xml规范,仔细一想真是,脑子不够用了,这么简单地错误都出来了,看来真是不能心急,于是把>< 号使用了<![CDATA[ ]]>标签括起来,代码如下:

     <if test="beginDate != null and beginDate != ''">AND stock_bill.bill_date <![CDATA[>=]]> #{beginDate}</if>
     <if test="endDate != null and endDate != ''">AND stock_bill.bill_date <![CDATA[<=]]>#{endDate}</if>

    ok,然后启动之后,我只选择开始时间,只选择结束时间,同时选择开始时间和结束时间,发现查询的结果都是正确的。

  • 相关阅读:
    时域和频域
    Python实用笔记 (26)面向对象高级编程——定制类
    Python实用笔记 (25)面向对象高级编程——多重继承
    去重-pd.duplicated
    合并pd.merge
    拼接
    pandas读取txt、excel、csv
    pandas字符串操作
    常用数据编辑-相加对齐
    成员判断
  • 原文地址:https://www.cnblogs.com/kevinZhu/p/6972771.html
Copyright © 2020-2023  润新知