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

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 是第二周的周一的时间
image.png
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mEHtVIhu-1685435387129)(https://cdn.nlark.com/yuque/0/2023/png/22324226/1685418111207-f878013f-3368-4538-bd9d-10051a5f6d50.png#averageHue=%23d9d9d9&clientId=u05034391-6c23-4&from=paste&height=1100&id=ue1d96024&originHeight=1100&originWidth=1252&originalType=binary&ratio=1&rotation=0&showTitle=false&size=152360&status=done&style=none&taskId=u45fcea9e-5ed8-4430-b945-b0d97938e0f&title=&width=1252)]

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;

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

5. 通过 DataEase 展示数据

使用开源的数据可视化工具展示上面的数据集
如下图所示:右表是完整数据,2023年 4月 和 5月 两个月的数据,左表为通过 SQL 筛选第三周的周四的数据,只有两天。
image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值