欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-04 21:09:31
...
问题背景:
在不同日期内进行不同的业务逻辑,在测试环境进行模拟,将日期设置当天时间,通过时分秒区分不同的日期;
不在此时间区间内的数据被统计到了此时间区间内;

问题定位:
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 ;


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