You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:12:34