如何用SQL获取本周及未来3周(共4周)的全部记录?
解决方案
原SQL写法在跨年、跨月场景下会出现逻辑漏洞,且无法直接覆盖未来3周的范围,推荐用日期范围判断的方式实现需求,优先选择unix时间戳直接比较的版本以提升查询性能。
高性能版(推荐)
直接通过unix时间戳计算范围,无需对每条记录调用日期转换函数,可利用date字段的索引优化查询:
SELECT *, FROM_UNIXTIME(date) as time FROM `events` WHERE date >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)) AND date < UNIX_TIMESTAMP(DATE_ADD(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), INTERVAL 4 WEEK))
易读版(日期字段比较)
若不考虑索引性能,也可以直接用转换后的日期字段做判断:
SELECT *, FROM_UNIXTIME(date) as time FROM `events` WHERE FROM_UNIXTIME(date) >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) AND FROM_UNIXTIME(date) < DATE_ADD(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), INTERVAL 4 WEEK)
关键说明
- 一周起始日调整:
- 上述代码默认以周一为一周第一天(
WEEKDAY()返回0=周一,6=周日)。 - 若系统以周日为一周起始,将
WEEKDAY(CURDATE())替换为DAYOFWEEK(CURDATE()) - 1即可(DAYOFWEEK()返回1=周日,2=周一)。
- 上述代码默认以周一为一周第一天(
- 范围逻辑:
DATE_SUB(CURDATE(), ...)获取本周第一天的00:00:00时间点。DATE_ADD(..., INTERVAL 4 WEEK)获取第5周的第一天,用<而非<=可自动包含第4周的最后一秒(23:59:59),避免时间边界的判断误差。
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

