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

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

问题定位:
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]
使用时间字段为了查询准确,建议只是用日期部分,可以将截止日志后延一天,以期取到时间范围
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值