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

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

时间:2023-05-30 16:32:20浏览次数:50  
标签:WEEK DAYOFWEEK SUB create SQL 获取 time 任意


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获取每个月第n周任意天的数据_每周周一_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周任意天的数据_SQL每个月_03


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

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

5. 通过 DataEase 展示数据

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

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

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

标签:WEEK,DAYOFWEEK,SUB,create,SQL,获取,time,任意
From: https://blog.51cto.com/u_15922912/6380378

相关文章

  • 根据ProcessId获取进程的窗口句柄
    functionTForm1.GetHWndByPID(consthPID:THandle):THandle;typePEnumInfo=^TEnumInfo;TEnumInfo=recordProcessID:DWORD;HWND:THandle;end;functionEnumWindowsProc(Wnd:DWORD;varEI:TEnumInfo):Bool;stdcall;var......
  • 关于数据库-SQL-between-运算符语句的使用及说明
    关于数据库SQL语句between运算符说明如下1、多用于选取介于两个值之间的数据范围内的值2、运算符选择给定范围内的值。值可以是数字,文本或日期3、是包含性的:包括开始和结束值,且开始值需小于结束值(否则返回空,即0条记录)关于SQL语句between的使用格式如下:selectcolumn_nam......
  • sqli-lab 15到18
    第15题发现不管输入什么都不报错应该是没有回显的,所以考虑时间盲注:先判断闭合方式:建议拿'、"、')、")、)、))、一个一个试:时间盲注应该这样试:uname=11&passwd=1'orsleep(4)---&submit=Submit这里注意,刚开始试了很多次全都没有反应,查了一下,原来是考虑欠周:在ge......
  • ef/efcore/sqlsugar group by字段 orderby count的写法
    ef/efcore:以datatype字段分组后按count倒序:varlist=db.table1.GroupBy(x=>x.DataType).Select(group=>new{group.Key,Count=group.Count()}).OrderByDescending(x=>x.Count).ToList(); sqlsugar:sqlsugargroupBy的返回值不是IQueryable<IGrouping<key,model>......
  • Mysql:数据库优化步骤
    数据库优化步骤查看mysql是否存在周期性波动1.1是。代表可能遇上如618,双十一等活动对数据库暂时性的压力增大,可以mysql加缓存或更改缓存策略1.2不是。大概率是本身开发人员编写的SQL有问题,或者是业务量达到一定程度引发的查询慢非周期性波动调优思路开启慢查询,并设定慢......
  • MySQL数据库A表和B表id冲突解决办法?
    方法1:不要定义自增长,用触发器来实现。方法2:不要定义自增长,两张表共享同一个sequence。(规则唯一)方法3:自增长,但是一张表是奇数,另一张全是偶数基于触发器的方法三:(对于现有系统的补救方案),最好的方案还是方法二使用同一个自增sequence获取--修改A表id别和B表id重复--查询最大的......
  • 2023-05-30 前端通过node获取七牛云的token(token最好还是在后端返回,前端获取token会暴
    constfs=require('fs');constqiniu=require('qiniu');varaccessKey='你的accessKey';varsecretKey='你的secretKey';varmac=newqiniu.auth.digest.Mac(accessKey,secretKey);//获取七牛tokenvaroptions={......
  • SQLServer 实用语句
    查询过去执行的查询慢SELECTt.text,(qs.total_elapsed_time/1000)/qs.execution_countASavg_elapsed_time,(qs.total_worker_time/1000)/qs.execution_countASavg_cpu_time,((qs.total_elapsed_time/1000)/qs.execution_count)-((qs.total_work......
  • springboot使用jdbc连接mysql(不用配置文件)
     1、连接mysql的工具类:packagecom.jzproject.common.mysql;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONArray;importorg.springframework.jdbc.core.JdbcTemplate;importjava.sql.*;importjava.util.ArrayList;importjava.util.HashMap;......
  • 查询Oracle数据字典SQL
    SELECT A.TABLE_NAMEAS"表名", A.COLUMN_NAMEAS"字段名", DECODE( A.CHAR_LENGTH, 0, DECODE( A.DATA_SCALE, NULL, A.DATA_TYPE, A.DATA_TYPE||'('||A.DATA_PRECISION||','||A.DATA_SCALE||')' ), ......