问题背景:
在不同日期内进行不同的业务逻辑,在测试环境进行模拟,将日期设置当天时间,通过时分秒区分不同的日期;
不在此时间区间内的数据被统计到了此时间区间内;
问题定位:
Mybatis配置文件中SQL
parameterType = map
确认传入的时间参数为字符串,格式为 yyyy-MM-dd HH:mm:SS,精确到时分秒,符合datetime 类型
查看SQL:
使用了 DATE 函数
即,虽然传入的参数为 yyyy-MM-dd HH:mm:SS 格式,经过 DATE 处理后变为 yyyy-MM-dd 格式
解决方式:
或
但这样修改是不对的,C_CREATE_TIME 是 datetime 类型,而等号右侧未指定时分秒是默认0时0分0秒
[url]http://www.w3school.com.cn/sql/sql_dates.asp[/url]
使用时间字段为了查询准确,建议只是用日期部分,可以将截止日志后延一天,以期取到时间范围
在不同日期内进行不同的业务逻辑,在测试环境进行模拟,将日期设置当天时间,通过时分秒区分不同的日期;
不在此时间区间内的数据被统计到了此时间区间内;
问题定位:
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]
使用时间字段为了查询准确,建议只是用日期部分,可以将截止日志后延一天,以期取到时间范围