MySQL高效查询过去一年中周一和周日的日期方法
在MySQL中高效检索过去一年的周一和周日日期
场景1:筛选表中已有日期列的符合条件记录
如果你的表(比如your_table)有日期字段date_col,直接通过日期范围+星期函数过滤即可,效率远高于手动筛选。
MySQL提供两个常用的星期判断函数,二选一即可:
WEEKDAY():返回0=周一,6=周日DAYOFWEEK():返回1=周日,2=周一
示例SQL:
-- 使用WEEKDAY的写法 SELECT date_col FROM your_table WHERE date_col >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) AND date_col <= CURDATE() AND WEEKDAY(date_col) IN (0, 6);
-- 使用DAYOFWEEK的写法 SELECT date_col FROM your_table WHERE date_col >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) AND date_col <= CURDATE() AND DAYOFWEEK(date_col) IN (1, 2);
优化技巧:
- 如果
date_col建有普通索引,上述写法会先利用索引快速缩小日期范围,再过滤星期几,性能优异。 - 若频繁按星期几筛选,可给
WEEKDAY(date_col)或DAYOFWEEK(date_col)创建函数索引,进一步提升查询速度。
场景2:生成过去一年所有的周一和周日(无需依赖表数据)
如果需要直接生成符合条件的日期序列(不管表中是否存在对应数据),分MySQL版本处理:
MySQL 8.0+(支持递归CTE)
用递归CTE生成过去一年的所有日期,再过滤星期几:
WITH RECURSIVE date_range AS ( SELECT DATE_SUB(CURDATE(), INTERVAL 1 YEAR) AS date_val UNION ALL SELECT DATE_ADD(date_val, INTERVAL 1 DAY) FROM date_range WHERE date_val < CURDATE() ) SELECT date_val FROM date_range WHERE WEEKDAY(date_val) IN (0, 6) ORDER BY date_val;
MySQL 5.x(无CTE支持)
通过数字表生成日期序列:
SELECT DATE_SUB(CURDATE(), INTERVAL n DAY) AS date_val FROM ( SELECT a.N + b.N * 10 + c.N * 100 AS n FROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a CROSS JOIN (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b CROSS JOIN (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) c ) nums WHERE n <= 365 AND WEEKDAY(DATE_SUB(CURDATE(), INTERVAL n DAY)) IN (0, 6) ORDER BY date_val;
内容的提问来源于stack exchange,提问作者Nikhil kedia
相关产品推荐
相关产品推荐

