1. 场景描述
MySQL 数据库中有日期字段,通过SQL查询每个月第n周的周内任意一天的数据。
2. 实现 SQL
通过SQL查询每个月第二周的周一的数据
SELECT
*
FROM
transactions
WHERE
DAYOFWEEK(`create_time`) = 2 AND
WEEK(`create_time`, 3) = WEEK(DATE_SUB(`create_time`, INTERVAL DAYOFMONTH(`create_time`) - 1 DAY), 3) + 1;
解析:
- DAYOFWEEK(create_time) = 2:这个条件要求 create_time 字段所代表的日期是周二,即它的星期几值为 2。
- WEEK(create_time, 3) = WEEK(DATE_SUB(create_time, INTERVAL DAYOFMONTH(create_time) - 1 DAY), 3) + 1:这个条件比较了 create_time 字段所在的周数与 create_time 所在月份的第一天所在周数。通过使用 WEEK 函数和 DATE_SUB 函数进行计算,确保了两个周数的一致性。
通过将这两个条件结合起来,查询将返回满足条件的记录集合。
请注意,查询语句中的 transactions 是一个占位符,你需要将其替换为实际的表名。另外,确保数据库中包含名为 transactions 的表,并且该表具有 create_time 列用于存储记录创建的时间信息。
3. 执行演示
SQL执行结果如下图,2023-5-8 是第二周的周一的时间
4. 调整日期方法:
DAYOFWEEK(日期
) = 2
# 1 表示周日,2 表示周一,3 表示周二 ... 7表示 周六;
SQL最后 + 1
# +1 表示第二个周 ,+2 第三个周 ... 以此类推。
示例:查询每个月第三周的周四的数据
SELECT
*
FROM
transactions
WHERE
DAYOFWEEK(`create_time`) = 5 AND
WEEK(`create_time`, 3) = WEEK(DATE_SUB(`create_time`, INTERVAL DAYOFMONTH(`create_time`) - 1 DAY), 3) + 2;
2023-4-13 是第三周的周四的日期
5. 通过 DataEase 展示数据
使用开源的数据可视化工具展示上面的数据集
如下图所示:右表是完整数据,2023年 4月 和 5月 两个月的数据,左表为通过 SQL 筛选第三周的周四的数据,只有两天。