MySQL如何查询10天前至1小时前时间范围内的数据
错误原因
- 原有逻辑错误核心是滥用
date()函数做时间截断:该函数会丢弃时间值里的时、分、秒信息,仅保留年月日,只要当前时间往前推1小时的结果和当前时间落在同一个自然日,二者的date()返回值就完全一致,根本没法卡准小时级的时间边界。 - 原有筛选条件只写了大于计算出的起始日期,既没有限定截止时间的上边界,还会因为日期截断漏掉起始日期当天早于截断点的有效数据,查出来的结果要么多要么少。
正确写法
先明确两个时间边界的计算逻辑,全程不要用date()截断时间,保留完整的时分秒精度:
- 区间上界(截止时间):当前时间往前推1小时,即
DATE_SUB(NOW(), INTERVAL 1 HOUR) - 区间下界(起始时间):上述截止时间再往前推10天,即
DATE_SUB(DATE_SUB(NOW(), INTERVAL 1 HOUR), INTERVAL 10 DAY)
替换到你的查询语句里即可,参考片段:
..... AND `time` >= DATE_SUB(DATE_SUB(NOW(), INTERVAL 1 HOUR), INTERVAL 10 DAY) AND `time` <= DATE_SUB(NOW(), INTERVAL 1 HOUR) GROUP BY ds .....
效果验证
举个对应你描述的场景:如果当前时间是某日上午8:00,计算后得到的截止时间是当日上午7:00,起始时间是10天前的上午7:00,最终返回的就是这两个时间点之间的全量数据,完全匹配需求。
注意:如果你的
time字段是字符串格式存储的时间,需要先确认格式能被MySQL正常识别解析,否则建议先转成DATETIME类型再做比较,避免隐式转换导致索引失效、筛选结果错误。
内容的提问来源于stack exchange,提问作者Codec737
相关产品推荐
相关产品推荐

