首页 > 数据库 >SQL--统计日期期间内每天的数据量,没有补0

SQL--统计日期期间内每天的数据量,没有补0

时间:2022-09-02 21:12:48浏览次数:55  
标签:-% -- create t1 DATE 数据量 SQL date SELECT

需求:

在某些业务后台看板中,需要统计某日期范围内每天的数据量,以及总的数据量,如果某一天没有数据,则补0

分析:

1、在数据库中规定日期范围内的日期可能不全,但是最后需要统计并展示每天的数据,所以要考虑日期补全
2、不存在的日期没有数据,要设置为0
3、最后需要对每天的数据量进行累加,统计每天的总数据量

实现:

第一步:统计结果

SELECT DATE_FORMAT(create_time, '%Y-%m-%d') date, count(id) num
FROM tb_clue
WHERE create_time BETWEEN #{startTime}
        AND #{endTime}
GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d')

DATE_FORMAT(date,format)函数用于以不同的格式显示日期/时间数据。date 参数是合法的日期表达式,format参数是日期/时间数据格式。此例中格式为yyyy-MM-dd

image

第二步:生成一个日期表

SELECT @cdate := DATE_ADD(@cdate, INTERVAL -1 DAY) date, 0 AS cou
FROM (
       SELECT @cdate := DATE_ADD(#{endTime}, INTERVAL + 1 DAY)
       FROM [任意有数据的表,但表的数据量尽量大,能包含开始时间到结束时间所有的数据]
   ) t1
WHERE @cdate > #{startTime}
ORDER BY date

DATE_ADD(date,INTERVAL expr type)表示对时间添加指定的时间间隔。date 参数是合法的日期表达式,expr 参数是您希望添加的时间间隔数值,可+可-,type参数时间单位。

image

第三步:通过外连接的方式将统计结果的表并入到日期表中

SELECT t1.date date,t2.num num
FROM (
         SELECT @cdate := DATE_ADD(@cdate, INTERVAL - 1 DAY) date
         FROM (
                  SELECT @cdate := DATE_ADD(#{endTime}, INTERVAL + 1 DAY)
                  FROM tb_clue
              ) t1
         WHERE @cdate > #{startTime}
         ORDER BY date
     ) t1
LEFT JOIN (
            SELECT DATE_FORMAT(create_time, '%Y-%m-%d') date,count(id) num
            FROM tb_clue
            WHERE create_time BETWEEN #{startTime} AND #{endTime}
            GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d')
          ) t2
ON t1.date = t2.date
ORDER BY t1.date ASC

image
第四步:处理统计结果,将Null值设置为0

SELECT t1.date date,IFNULL(t2.num, 0) num
FROM (
         SELECT @cdate := DATE_ADD(@cdate, INTERVAL - 1 DAY) date
         FROM (
                  SELECT @cdate := DATE_ADD(#{endTime}, INTERVAL + 1 DAY)
                  FROM tb_clue
              ) t1
         WHERE @cdate > #{startTime}
         ORDER BY date
     ) t1
LEFT JOIN (
            SELECT DATE_FORMAT(create_time, '%Y-%m-%d') date,count(*) num
            FROM tb_clue
            WHERE create_time BETWEEN #{startTime} AND #{endTime}
            GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d')
          ) t2
ON t1.date = t2.date
ORDER BY t1.date ASC

IFNULL(UnitsOnOrder,0)函数用于规定如何处理 NULL 值,是MySQL的方言。如果UnitsOnOrder为Null,则返回0

image
第五步:计算每天的总数据量(根据业务的实际情况)

SELECT t3.date,(SELECT count(t4.create_time) FROM tb_clue t4 WHERE t4.create_time<=t3.date) num FROM
(
  SELECT t1.date date,IFNULL(t2.num, 0) num
  FROM (
         SELECT @cdate := DATE_ADD(@cdate, INTERVAL - 1 DAY) date
         FROM (
                  SELECT @cdate := DATE_ADD(#{endTime}, INTERVAL + 1 DAY)
                  FROM tb_clue
              ) t1
         WHERE @cdate > #{startTime}
         ORDER BY date
     ) t1
  LEFT JOIN (
            SELECT DATE_FORMAT(create_time, '%Y-%m-%d') date,count(*) num
            FROM tb_clue
            WHERE create_time BETWEEN #{startTime} AND #{endTime}
            GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d')
          ) t2
  ON t1.date = t2.date
  ORDER BY t1.date ASC
) t3

标签:-%,--,create,t1,DATE,数据量,SQL,date,SELECT
From: https://www.cnblogs.com/cxy-lxl/p/16650700.html

相关文章

  • Maven
    一、Maven简介1.1在项目中如何导入jar包?下载jar包,(mvn)将下载的jar包拷贝到项目中(WEB-INF/lib)选择jar文件--右键--AddasLibrary1.2传统导入jar包的方式......
  • 点赞(十九)
    点赞支持对帖子、评论点赞。第1次点赞,第2次取消点赞。首页点赞数量统计帖子的点赞数量。详情页点赞数量统计点赞数量。显示点赞状态。一、新建生成redi......
  • redis持久化部署
    redis持久化部署Redis简介软件说明Redis是一款开源的,ANSIC语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品。Redis采用内存(In-Memory)数据集(DataS......
  • maven如何配置统一依赖多版本共存?
    本来可以通过在groupId后面加点来共存jar包的多版本,就像这样<dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId></dependenc......
  • 成员变量、静态代码块、非静态代码块、构造器的初始化顺序
    首先说结论吧静态成员变量->父类静态代码块->子类静态成员变量->子类静态代码块->父类成员变量->父类非静态代码快->父类构造器->子类成员变量->子类非静态代码块->子类......
  • osi相关学习
    1.分层的优点2.七层模型3.TCP/IP参考模型4.理想的网络设计5.数据封装的方法 1.分层的优点层次划分的方法网络的每层应当具有相对独立的功能(便于排错)这个功能用......
  • Redis中设置了过期时间的Key,那么你还要知道些什么?
    熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。这就是Redis的过期策略。在为key设置过期时间需要注......
  • Spring Boot 面试,一个问题就干趴下了!
    最近有很多人面试,其中不乏说对SpringBoot非常熟悉的,然后当我问到一些SpringBoot核心功能和原理的时候,没人能说得上来,或者说不到点上,可以说一个问题就问趴下了!......
  • SpringMVC
    一、SpringMVC1、回顾MVC1.1、什么是MVCMVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织......
  • 学习linux基础,补充记背
     1.linux基础1.1cp1.2ls1.3find1.4selinux1.5echo1.6pwd1.7通配符1.8创建1.9touch1.10连接1.11xargs1.12其他命令  1.linux基础命令1.1c......