如何从MySQL的PACKAGES表筛选SERVICE_EXPIRY_DATE未来15天内到期的记录?
查询MySQL中服务到期日15天内的记录
嗨,这个需求很常见,我给你几种实用的实现方式,还会顺带提下性能优化的关键点:
方法一:使用
DATE_ADD与当前时间范围匹配(推荐,性能更优)
这种方式直接对当前时间做计算,不会修改查询的列,所以如果SERVICE_EXPIRY_DATE上有索引的话,MySQL可以直接利用索引加速查询:SELECT * FROM PACKAGES WHERE SERVICE_EXPIRY_DATE BETWEEN CURRENT_TIMESTAMP AND DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 15 DAY);解释一下:
CURRENT_TIMESTAMP会返回当前的日期时间,DATE_ADD把当前时间往后推15天,BETWEEN就精准匹配了从现在到15天后的到期记录,刚好符合你要的“距离查询时刻15天以内”的需求。方法二:使用
DATEDIFF计算天数差
如果你更习惯用天数差来判断,也可以用DATEDIFF函数,不过要注意参数顺序(MySQL中DATEDIFF(a,b)返回a - b的天数差):SELECT * FROM PACKAGES WHERE DATEDIFF(SERVICE_EXPIRY_DATE, CURRENT_TIMESTAMP) BETWEEN 0 AND 15;这里
0代表刚好今天到期,15代表15天后到期,区间内的记录都会被选中。不过要注意:这种写法因为用函数包裹了SERVICE_EXPIRY_DATE列,MySQL无法利用该列的索引,数据量大的时候查询会变慢,所以优先选方法一。
额外注意事项
- 边界调整:如果你的需求是“不到15天”(即排除刚好第15天的记录),可以把
INTERVAL 15 DAY改成INTERVAL 14 DAY,或者把DATEDIFF的上限设为14。 - 索引优化:如果你的
PACKAGES表数据量较大,一定要给SERVICE_EXPIRY_DATE建索引,能大幅提升查询速度:CREATE INDEX idx_service_expiry_date ON PACKAGES(SERVICE_EXPIRY_DATE); - 日期类型兼容:不管
SERVICE_EXPIRY_DATE是DATETIME还是DATE类型,上面的语句都能正常工作,MySQL会自动做类型转换匹配。
内容的提问来源于stack exchange,提问作者User 101
相关产品推荐
相关产品推荐

