MyBatis和Mysql中 同一语句查询结果不一致问题

问题

MySQL中的执行查询

 select count(*) from road where send_date between '2021-05-09' AND '2021-06-03';

查询结果:

count(*)
15021

SpringBoot整合Mybatis执行查询
xml中的select标签:

<select id="getTotalCount" resultType="Integer">
        select count(*) from road where send_date between #{beginDate} and #{endDate}
</select>

查询结果:

count(*)
14887

明明是同样的语句,查出来的结果却差了百十条记录!!!

解决

想着会不会是关联查询引起的,但是这条语句就是个单表查询,也不该这样哈。
最终!发现查询的条件是时间,数据库里的时区没有问题,是东八区的。
但是springboot项目中的配置url中却是UTC。所以在项目中查询的时候,时间和数据库中的记录相差8小时

这是原先的配置:

 spring: 
 	datasource: 
 		url: jdbc:mysql://127.0.0.1:3306/database1?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8

把它改成serverTimezone=Asia/Shanghai就好咯,如下

 spring: 
 	datasource: 
 		url: jdbc:mysql://127.0.0.1:3306/database1?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8

新的问题。

另外一条根据这个时间排序的语句,得到的查询结果,在mysql和mybatis两边又不一样了。

SELECT road.ID FROM road 
	left OUTER JOIN driver 
	on road.ID = driver.ROAD_ID
WHERE road.send_date BETWEEN '2021-05-09' AND '2021-06-03' order by road.send_date ASC;

正常应该是从05-09日的记录开始,到06-03日的记录结束。
但是在项目中查询返回的数据里,却显示是从05-08日的记录开始的。
而且返回数据里对应字段值为
"send_date": "2021-05-08T16:00:00.000+00:00"
数据库中的字段格式为:send_date: 2021-05-09 ,类型是date
于是想到应该是时间格式的问题,而且也是受到时区的影响。数据库字段设计的类型是date,没有具体时分秒的时间,所以在项目中返回的时候,就默认为当天的00:00:00,比如2021-05-09 00:00:00
再受到时区影响,早8小时,结果就成了前一天的16:00了。

解决

加个配置,让返回的json数据里的时间也是东八区

spring:
	jackson:
    	time-zone: GMT+8
    url: jdbc:mysql://127.0.0.1:3306/database1?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8

总结

非常愚蠢的一次经历。。查询的时候,遇到时间相关的问题,第一时间检查时区相关设置。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值