问题
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
总结
非常愚蠢的一次经历。。查询的时候,遇到时间相关的问题,第一时间检查时区相关设置。