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;

解析:

  1. DAYOFWEEK(create_time) = 2:这个条件要求 create_time 字段所代表的日期是周二,即它的星期几值为 2。
  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 是第二周的周一的时间

通过SQL获取每个月第n周任意天的数据_SQL每个月


通过SQL获取每个月第n周任意天的数据_SQL每个月_02

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;

通过SQL获取每个月第n周任意天的数据_数据_03


2023-4-13 是第三周的周四的日期

通过SQL获取每个月第n周任意天的数据_数据_04

5. 通过 DataEase 展示数据

使用开源的数据可视化工具展示上面的数据集

如下图所示:右表是完整数据,2023年 4月 和 5月 两个月的数据,左表为通过 SQL 筛选第三周的周四的数据,只有两天。

通过SQL获取每个月第n周任意天的数据_SQL_05