MyBatis中如何查询某个时间段内的数据

目录
  • 如何查询某个时间段内的数据
  • Mybatis查询日期范围
    • 将日期时间,转换为字符串
    • 将字符串,转换为日期时间

如何查询某个时间段内的数据

1、当使用SQL语句查询某个时间段的数据时

我们很自然的会想到使用between…and..来操作,但是如果使用between...and... 这个方法来查询某个时间段的数据时是需要传入两个参数的,一个是起始时间,另一个是结束时间,且两个参数必须要同时存在才能使用between...and...,而我们希望的是只传入一个参数(起始时间或者结束时间)就能进行查询。

但是在使用MyBatis时如果只传入一个参数,则相应的SQL语句是不会执行的,所以不能使用between...and... 来进行某个时间段数据的查询。

2、可以使用" >= ... AND ... <=" 来解决

例如:

SELECT * FROM o_info WHERE create_date >= '2019-03-10 17:04:04' AND create_date  <= '2019-03-15 17:04:28';

但是若要在MyBatis中使用,有一点需要注意:在MyBatis中使用">"和"<"时会提示"The content of elements must consist of well-formed character data or markup."这个错误,原因是使用的">"和"<"不符合xml的书写规范,所以需要把">"和"<"使用<![CDATA[ ]]>标签括起来才行。

使用<![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>

这样就可以实现只选择开始时间或者只选择结束时间,同时选择开始时间和结束时间来进行查询了。

3、如果查询时出现异常提示

### Error querying database.  Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

是因为传入的参数类型是日期类型,但是在<if test="beginDate != null and beginDate != ''">和<if test="endDate != null and endDate != ''">却用这个日期类型的参数与空字符串进行了比较,所以出现了程序运行时异常,解决方法是将与空字符串比较的判断去掉,只保留非空判断即可。

4、最终的代码:

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

Mybatis查询日期范围

将日期时间,转换为字符串

select
s.*
from BIZ_ASSAY_ORDER_SAMPLE s
LEFT JOIN BIZ_ASSAY_ORDER o on o.ID=s.ORDER_ID
WHERE 1=1
<if test="status !=null and status !=''">
    AND s.RECORD_STATUS=#{status}
</if>
<if test="sampleNo !=null and sampleNo !=''">
    AND s.SAMPLE_NO LIKE '%'||#{sampleNo}||'%'
</if>
<if test="orderNo !=null and orderNo !=''">
    AND o.ORDER_NO LIKE '%'||#{orderNo}||'%'
</if>
<if test="sampleBizModelId !=null and sampleBizModelId !=''">
    AND s.SAMP_BIZ_MODE_ID=#{ sampleBizModelId }
</if>
<if test="statusFlag !=null and statusFlag !=''">
    AND s.STATUS_FLAG=#{ statusFlag }
</if>
<if test="fromDate != null and fromDate !=''">
    and to_char(o.ORDER_DATE,'yyyy-MM-dd') >=  #{fromDate}
</if>
<if test="toDate != null and toDate !=''">
    and to_char(o.ORDER_DATE,'yyyy-MM-dd') <=  #{toDate}
</if>

关键代码

<if test="fromDate != null and fromDate !=''">
    and to_char(o.ORDER_DATE,'yyyy-MM-dd') >=  #{fromDate}
</if>
<if test="toDate != null and toDate !=''">
    and to_char(o.ORDER_DATE,'yyyy-MM-dd') <=  #{toDate}
</if>

或者

将字符串,转换为日期时间

SELECT
<include refid="Base_Column_List"/>
FROM BIZ_DAILY_PLAN dp
LEFT JOIN DIC_TEST_OBJECT tb ON dp.TEST_OBJECT_ID=tb.ID
LEFT JOIN DIC_SAMPLE_BIZ_MODEL bm ON dp.SAMP_BIZ_MODE_ID=bm.ID
LEFT JOIN RES_LABORATORY l ON dp.LABORATORY_ID=l.ID
WHERE 1=1 AND dp.RECORD_STATUS = ${@cn.com.hwasunsoft.lims.core.enums.RecordStatusEnum@VALID.getValue()}
<if test="dailyPlanStatus !=null and dailyPlanStatus !=''">
    AND dp.CONFIRMATION_STATUS=#{dailyPlanStatus}
</if>
<if test="status !=null and status !=''">
    AND dp.RECORD_STATUS=#{status}
</if>
<if test="labId !=null and labId !=''">
    AND dp.LABORATORY_ID=#{labId}
</if>
<if test="fromDate !=null and fromDate !=''">
    AND dp.PLAN_DATE >= TO_DATE(#{fromDate},'yyyy-mm-dd')
</if>
<if test="toDate !=null and toDate !=''">
    AND TO_DATE(#{toDate},'yyyy-mm-dd') >= dp.PLAN_DATE
</if>

关键代码

<if test="fromDate !=null and fromDate !=''">
    AND dp.PLAN_DATE >= TO_DATE(#{fromDate},'yyyy-mm-dd')
</if>
<if test="toDate !=null and toDate !=''">
    AND TO_DATE(#{toDate},'yyyy-mm-dd') >= dp.PLAN_DATE
</if>

日期等于某天

直接把大于、小于号,改为等于号

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 一文教会你用mybatis查询数据库数据

    目录 一.新建数据库和表 二.新建maven项目,添加mybatis依赖 三.新建实体类.接口(Mapper) 四.新建实现类(使用.xml映射文件) 五.新建全局配置文件(mybatis-config.xml) 六.编写demo类,进行测试查询数据库 总结 一.新建数据库和表 建一个数据库mybatis,建一个表person,然后填充一些数据(这里我是使用了图形化工具Navicat for MySQL,就不写原生的数据库代码了) 二.新建maven项目,添加mybatis依赖 新建一个mave

  • Mybatis和Mybatis-Plus时间范围查询方式

    一.mysql 1.传入时间范围参数类型是字符串 <if test="startTime!=null and startTime.trim() neq ''"> and date_format(create_time,'%Y-%m-%d %H:%i:%s') >= str_to_date(#{startTime},'%Y-%m-%d %H:%i:%s') </if> <if test="endTime!=null and endTime.t

  • mybatis mapper.xml 区间查询条件详解

    目录 mybatis mapper.xml 区间查询条件 对 null 和 " 分开进行判断 tk mybatis通用mapper,复杂and or条件查询 方式1:Weekend语法 方式2:通用example语法 mybatis mapper.xml 区间查询条件 对 null 和 " 分开进行判断 <select id="selectByExample" resultMap="BaseResultMap" parameterType=

  • Mybatis-Plus根据时间段去查询数据的实现示例

    业务需求:在前端界面选择开始时间.结束时间,后台根据拿到的开始.结束时间去数据库中查询该段时间的数据集返回给前端界面. 1.前端我使用的是elementUI和vue框架,最好是在前端界面进行一个简单的校验规则,对比一下开始时间和结束时间的大小,校验的代码很简单,直接在触发查询按钮的函数前面加入校验即可.代码如下: if(this.StafPsnClctDetlDFormQuery.startTime >= this.StafPsnClctDetlDFormQuery.endTime){ this

  • MyBatis中如何查询某个时间段内的数据

    目录 如何查询某个时间段内的数据 Mybatis查询日期范围 将日期时间,转换为字符串 将字符串,转换为日期时间 如何查询某个时间段内的数据 1.当使用SQL语句查询某个时间段的数据时 我们很自然的会想到使用between…and..来操作,但是如果使用between...and... 这个方法来查询某个时间段的数据时是需要传入两个参数的,一个是起始时间,另一个是结束时间,且两个参数必须要同时存在才能使用between...and...,而我们希望的是只传入一个参数(起始时间或者结束时间)就能进

  • vue前端和Django后端如何查询一定时间段内的数据

    前言 在开发过程中经常会遇到筛选查询之类的功能,比如查询某一个时间段内的数据而非所有数据. 这样我们就需要向后端发送时间段的参数,然后在后端处理查询. 这里以Django后端和vue前端的简单例子来记录大致实现. 后端数据库 这里是一些简单的数据重要的是date,我们需要根据日期来筛选返回到前端. models.py class CountDownSign(models.Model): name = models.CharField(max_length=1000) date = models.

  • MySql查询某个时间段内的数据实例(前一周、前三个月、前一年等)

    目录 1.使用函数DATE_SUB (1).前一周的数据 (2).前三个月的数据 (3).前一年的数据 2.使用函数DATE_ADD (1).前一周的数据 (2).前三个月的数据 (3).前一年的数据 总结 1.使用函数DATE_SUB DATE_SUB函数在当前时间减去一定的时间 DATE_SUB(date,INTERVAL expr unit) date:合法日期,可以是当前时间now() expr:希望减去的时间,整数 unit:减去时间的单位,如day,week,month,year 实

  • Mybatis中连接查询和嵌套查询实例代码

    首先在mysql中确立表: #表一:地址国家表 CREATE TABLE address(aid INT AUTO_INCREMENT PRIMARY KEY,aname VARCHAR(20)); INSERT INTO address VALUES(NULL,"魏国"); INSERT INTO address VALUES(NULL,"蜀国"); INSERT INTO address VALUES(NULL,"吴国"); #表二:出场人物

  • 问个高难度的复杂查询(在一个时间段内的间隔查询)

    我想在一个时间段内然后按照间隔时间来查询数据 select * from 监控温度表 where 监控温度表.时间 between '" + Str(dtStart.Value) + "'AND '" + Str(dtEnd.Value) + "'order by id 这个是在一个时间段内查询,现在要加个时间间隔来查询,不知所云,望高手解答 其中dtStart.Value和dtEnd.Value是DTPicker1控件 举例:比如说我查询时间段在 2007-1-5

  • MyBatis中模糊查询使用CONCAT('%',#{str},'%')出错的解决

    目录 模糊查询使用CONCAT('%',#{str},'%')出错 原因及解决 MyBatis like模糊查询,CONCAT函数用法 以MySQL为例 模糊查询使用CONCAT('%',#{str},'%')出错 原因及解决 经过我一套乱七八糟毫无思路地查找后,发现不是Mybatis的原因,原来是SQL server不支持CONCAT函数,直接用加号连接就好 MyBatis like模糊查询,CONCAT函数用法 以MySQL为例 <select id="getByPage"

  • MyBatis中关于resultType和resultMap的区别介绍

    MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key-->value关系),但是resultType跟resultMap不能同时存在. 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值.

  • MyBatis的嵌套查询解析

    Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-many.many-to-one.one-to-one.而是只有两种association(一).collection(多),表现很简洁.下面通过一个实例,来展示一下Mybatis对于常见的一对多和多对一关系复杂映射是怎样处理的. 以最简单的用户表订单表这个最简单的一对多做示例: 对应的JavaBean: User: public class User { private int id; private String

  • MyBatis中的resultMap简要概述

    Mybatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. Mybatis的功能架构分为三层(图片借用了百度百科): 1)       API接口层:提供给外部使用的接口API,开发人员通过这些本地API

  • 深入理解Mybatis中的resultType和resultMap

     一.概述 MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在. 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值. ①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给

随机推荐