关于日期查询,今天遇到个坑:
就是我用 date_format 函数来查询某个时间段的数据,无论是数据库还是mybatis都可以查询,都没问题 ;
但是我如果要精确查询某一天的数据,在数据库中查询没有问题,但是在mybatis中却查不到,我把控制台的sql语句复制到数据库中执行都能查询到数据。
详细情况如下:
一、查询某个时间段的数据:
AND date_format(start_time,'%y%m%d') >= date_format(#{startTime},'%y%m%d')
AND date_format(end_time,'%y%m%d') <= date_format(#{endTime},'%y%m%d')
用 date_format,然后大于等于或者小于等于,也可以用 between 。这里无论是在mybatis中还是在sql中查询都没有问题。
二、查询具体某一天的数据:
AND date_format(start_time,'%y%m%d') = date_format(#{startTime},'%y%m%d')
AND date_format(end_time,'%y%m%d') = date_format(#{endTime},'%y%m%d')
而这里,在mybatis中死活查询不到数据,我把控制台的sql语句复制到数据库中去执行都可以查询字段也反复检查了没有问题,可在mybatis中就是查不到。
文章图片
上图很明显,已经把日期传过来了;也不是后面时分秒的原因,因为我在数据库中执行这句sql,把日期值设置成精确到时分秒,也是可以查询到数据的,如下:
date_format(start_time,'%y%m%d') >= date_format('2021-02-11 00:00:00.0','%y%m%d')
但偏偏mybatis就是查不到,后面我有试过把date_format换成to_days()函数,还是一样,sql执行没问题,mybatis中执行查不到数据。就挺离谱的,一直想不通是哪里的问题。
三、解决 然后我换了一种方法查询,使用DATE_SUB和DATE_ADD函数,如下:
AND (#{startTime} >date_sub(start_time, INTERVAL 1 DAY)
and date_add(start_time,interval 1 day) > #{startTime})
AND (#{endTime} >date_sub(end_time, INTERVAL 1 DAY)
and date_add(end_time,interval 1 day) > #{endTime})
date_sub 减一天
date_add 加一天
比如:
AND ('2021-02-11' >date_sub(start_time, INTERVAL 1 DAY)
and date_add(start_time,interval 1 day) > '2021-02-11'
这里总算可以查出来了,无论是在sql还是mybatis都可以查询出数据。
【mybatis|mybatis日期查询的坑(具体查询某一天的数据,数据库中能查询到结果,但是mybatis中却查询不到)】以上,太坑了,不知道为什么会有这种情况,百度了半天大部分都是说数据库连错了或者字段错了,就离谱,如果数据库连错了或字段错了,控制台不直接报错?这样我也用不着在网上找半天了。
推荐阅读
- mysql优化|尚硅谷MySQL高级笔记——前篇
- mysql|MySQL高级——锁
- MySQL|MySQL8.0高级应用——基础理论篇
- 数据库|MySQL锁机制【MySQL高级篇5】
- mysql|mysql like 4种优化_MySQL高级(四)(索引优化)
- mysql|mysql 联合索引 单列索引_Mysql优化-mysql索引-多个单列索引、联合索引
- mysql|mysql 联合索引 单列索引_mysql单列索引和联合索引的使用
- JAVA开发|mysql数据库安装
- SSM框架解析|【SSM框架】Mybatis详解10(源码自取)之入参、返回值map