写点什么

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

  • 2023-05-30
    北京
  • 本文字数:771 字

    阅读完需:约 3 分钟

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

1. 场景描述

MySQL 数据库中有日期字段,通过 SQL 查询每个月第 n 周的周内任意一天的数据。

2. 实现 SQL

通过 SQL 查询每个月第二周的周一的数据


SELECT     *FROM     transactionsWHERE     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 是第二周的周一的时间




4. 调整日期方法:

DAYOFWEEK(日期) = 2


# 1 表示周日,2 表示周一,3 表示周二 ... 7 表示 周六;


SQL 最后 + 1


# +1 表示第二个周 ,+2 第三个周 ... 以此类推。


示例:查询每个月第三周的周四的数据


SELECT     *FROM     transactionsWHERE     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 筛选第三周的周四的数据,只有两天。



用户头像

还未添加个人签名 2022-12-26 加入

还未添加个人简介

评论

发布
暂无评论
通过SQL获取每个月第n周任意天的数据_sql查询_搞大屏的小北_InfoQ写作社区