背景
昨天测试反馈问题说某个界面查询数据不准确,明明是在查询条件内的数据却查询不到,很诡异。我看了下,查询条件也只有创建时间这一个,如:2022-1-8 00:00:00~2022-1-8 23:59:59,但在那一天的数据却是死活出不来。
思考
基于这个bug再结合之前的开发经验,我有了以下一些推测:
- 查询数据的sql有问题,例如查询的不是创建时间,而是作用到其他时间上面去了
- 前端日期传值问题,如使用JSON.stringify转换Date出现了问题
- java逻辑代码把查询到的数据过滤掉了
验证
拿这个条件,我导出sql在数据库中执行了一遍,能查询出来数据,那就不是sql的问题了,之后debug查看前端传过来的查询参数,没有问题,时间和我想要的时间没有差异,再下一步一步步往下中,到查询的时候,放开,返回值直接为空集合,到这就很奇怪了,相同条件,相同数据,数据库查询和系统查询居然出现了不一样的结果。到这,我前面的推测显示错误。
后来我想到,系统操作数据库是通过mybatis,在这中间可以又其他的操作,我仔细排查了我写的sql,发现了我写的一行代码:and m.accounts_time >= #{params.ewbCreatedStartTime,jdbcType=DATE}。这个类型映射看起来怪怪的,然后我把DATE替换成了TIMESTAMP,再跑一遍,(o゜▽゜)o☆[BINGO!]可以了
结论
mybatis中 jdbcType 时间类型,当jdbcType = DATE 时, 只传入了 年月日,jdbcType = TIMESTAMP 则包含了时分秒。