`

检索指定时间范围内的数据与预期不一致

阅读更多
问题背景:
在不同日期内进行不同的业务逻辑,在测试环境进行模拟,将日期设置当天时间,通过时分秒区分不同的日期;
不在此时间区间内的数据被统计到了此时间区间内;

问题定位:
Mybatis配置文件中SQL
parameterType = map
确认传入的时间参数为字符串,格式为 yyyy-MM-dd HH:mm:SS,精确到时分秒,符合datetime 类型

查看SQL:
SELECT * FROM `p2p_td_project_invest`
WHERE 1=1
 AND DATE(C_CREATE_TIME) >= DATE("2017-10-27 18:31:00")
 AND DATE(C_CREATE_TIME) <= DATE("2017-10-27 18:45:00")
 ORDER BY C_CREATE_TIME DESC LIMIT 10 ;


使用了 DATE 函数
SELECT DATE(C_CREATE_TIME) FROM p2p_td_project_invest ORDER BY C_CREATE_TIME DESC LIMIT 10 ;
-- 查询结果为 yyyy-MM-dd

SELECT DATE("2017-10-27 18:45:00") FROM DUAL ;
-- 查询结果为 yyyy-MM-dd


即,虽然传入的参数为 yyyy-MM-dd HH:mm:SS 格式,经过 DATE 处理后变为 yyyy-MM-dd 格式

解决方式:
SELECT * FROM `p2p_td_project_invest`
WHERE 1=1
 AND C_CREATE_TIME >= DATE("2017-10-10")
 AND C_CREATE_TIME <= DATE("2017-10-19") 
 ORDER BY C_CREATE_TIME DESC LIMIT 10 ;
-- 去掉字段上的DATE 函数,结果正确


 SELECT * FROM `p2p_td_project_invest`
WHERE 1=1
 AND C_CREATE_TIME >= "2017-10-27 00:00:00"
 AND C_CREATE_TIME <= "2017-10-27 23:59:59"
 ORDER BY C_CREATE_TIME DESC LIMIT 10 ;



但这样修改是不对的,C_CREATE_TIME 是 datetime 类型,而等号右侧未指定时分秒是默认0时0分0秒
SELECT * FROM `p2p_td_project_invest`
WHERE 1=1
 AND C_CREATE_TIME >= "2017-10-27"
 AND C_CREATE_TIME <= "2017-10-27"
 ORDER BY C_CREATE_TIME DESC LIMIT 10 ;


http://www.w3school.com.cn/sql/sql_dates.asp
使用时间字段为了查询准确,建议只是用日期部分,可以将截止日志后延一天,以期取到时间范围
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics