概述

需求为查询数据库中7天内的数据,并按天统计;查询数据库中12个月的数据,并按月份统计;查询数据库中5年内的数据,并按年统计;

思路

首先获取7日、1年、5年的数据时间,将该数据时间做成一个零时表,再通过LEFT JOIN ···ON ···去关联实际需要查询的数据表;

数据库测试数据截图

7天内数据查询及补0

原SQL查询 无数据补0

--  7天内查询
select id,today_in, create_date from test_time
where create_date >DATE_SUB(CURDATE(), INTERVAL 7  DAY);

查询结果

可以看到我当前测试的时间为2021-12-21,那么7日内就是2021-12-152021-12-21,其中有12-1812-21是没有数据的,我们就需要进行补0的操作

SQL数据补0操作

首先获取7天内所有日期

SELECT @cdate := date_add( @cdate, INTERVAL - 1 DAY ) date
FROM ( SELECT @cdate := date_add( CURDATE(), INTERVAL 1 DAY ) FROM test_time LIMIT 7 ) a

查询结果

整合

首先将上面获取7日内时间的SQL作为一个临时数据集,然后左连接原来的SQL查询语句

-- 7天内按天统计 补0
SELECT IFNULL( b.today_in, 0 ) today_in,aa.date create_date
FROM (SELECT @cdate := date_add( @cdate, INTERVAL - 1 DAY ) date FROM ( SELECT @cdate := date_add( CURDATE(), INTERVAL 1 DAY ) FROM test_time LIMIT 8 ) a ) aa LEFT JOIN (select id,today_in, create_date from test_timewhere create_date >=DATE_SUB(CURDATE(), INTERVAL 7  DAY)) b on aa.date = b.create_date
ORDER BY aa.date DESC;

查询结果


可以看到12-18至12-21没有数据的部分已经自动补0

1年内数据查询按月统计及补0

原SQL查询 无数据补0

-- 1年内按月统计
SELECT sum(today_in) today_in,mon create_date
FROM (SELECT today_in,create_date, DATE_FORMAT(create_date,'%Y-%m') monFROM test_time WHERE create_date >= DATE_SUB(CURDATE(),INTERVAL 1 YEAR)) a
GROUP BY mon DESC;

查询结果


可以看到只有11和12月有数据,1月至10月没有数据则没有查询结果

SQL数据补0操作

首先获取1年内所有月份

-- 一年所有月份
SELECT DATE_FORMAT( @cdate := date_add( @cdate, INTERVAL - 1 MONTH ), '%Y-%m' ) date
FROM ( SELECT @cdate := date_add( CURDATE(), INTERVAL 1 MONTH ) FROM test_time  ) a

查询结果

整合

-- 1年内按月统计 补0
SELECT IFNULL( b.today_in, 0 ) today_in,aa.date create_date
FROM (SELECT DATE_FORMAT( @cdate := date_add( @cdate, INTERVAL - 1 MONTH ), '%Y-%m' ) date FROM ( SELECT @cdate := date_add( CURDATE(), INTERVAL 1 MONTH ) FROM test_time  ) a) aa LEFT JOIN (SELECT sum(today_in) today_in,mon create_date FROM (SELECT today_in,create_date, DATE_FORMAT(create_date,'%Y-%m') monFROM test_time WHERE create_date >= DATE_SUB(CURDATE(),INTERVAL 1 YEAR)) aGROUP BY mon DESC) b on aa.date = b.create_date;

查询结果

5年内数据查询按年统计及补0

原SQL查询 无数据补0

--  5年内按年统计
SELECT sum(today_in) today_in,year create_date
FROM (SELECT today_in, DATE_FORMAT(create_date,'%Y') yearFROM test_time WHERE create_date >= DATE_SUB(CURDATE(),INTERVAL 5 YEAR)) a
GROUP BY year;

查询结果

可以看到只有18年至21年有数据,7年没有数据则没有查询结果

SQL数据补0操作

首先获取5年内所有年份

-- 五年所有年份
SELECT DATE_FORMAT( @cdate := date_add( @cdate, INTERVAL - 1 YEAR ), '%Y' ) date
FROM ( SELECT @cdate := date_add( CURDATE(), INTERVAL 1 YEAR ) FROM test_time LIMIT 5) a

查询结果

整合

-- 5年内按年统计 补0
SELECT IFNULL( b.today_in, 0 ) today_in,aa.date create_date
FROM (SELECT DATE_FORMAT( @cdate := date_add( @cdate, INTERVAL - 1 YEAR ), '%Y' ) date FROM ( SELECT @cdate := date_add( CURDATE(), INTERVAL 1 YEAR ) FROM test_time LIMIT 5) a ) aaLEFT JOIN (SELECT sum(today_in) today_in,year create_date FROM (SELECT today_in, DATE_FORMAT(create_date,'%Y') yearFROM test_time WHERE create_date >= DATE_SUB(CURDATE(),INTERVAL 5 YEAR)) aGROUP BY year) b on aa.date = b.create_date;

查询结果

总结

主要先将需要查询的时间段内所有时间查询出来并作为临时数据表,在通过日期关联左连接即可。

函数 描述
IFNULL(expression, alt_value) 如果第一个参数的表达式 expression 为 NULL,则返回第二个参数的备用值
关键字 描述
LEFT JOIN ···ON··· 从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL

MySQL查询近7天、1年、5年内数据,无数据部分补0相关推荐

  1. MySQL查询近12个月数据,无则补0

    查询近12个月数据,无则补0 select v.month,ifnull(b.count,0) count from (SELECT DATE_FORMAT(CURDATE(), '%Y-%m') A ...

  2. mysql 查询某个日期时间段,每天同一时间段的数据

    mysql 查询某个日期时间段,每天同一时间段的数据: SELECT * FROM t_a01_eltable WHERE DATE_FORMAT(acqtime,'%Y-%m-%d')>='2 ...

  3. mysql 查询近几天的数据

    前言 mysql 需求:查询近30天的文章 查询近30天的文章 SELECT * FROM article WHERE pubTime >= NOW( ) - INTERVAL 30 DAY 注 ...

  4. mysql 查询近两周的记录_查询近一周、近两周的数据

    一.利用mysql函数TO_DAYS,通过该函数计算返回的是天数 示例:查询近一周的数据 select * from table where TO_DAYS(NOW()) - TO_DAYS(fiel ...

  5. 你会不会用mysql查询近7个月的数据?没有记录默认为空

    版权声明:欢迎转载,请注明沉默王二原创. https://blog.csdn.net/qing_gee/article/details/68059203 做报表统计的时候,常常需要在MySQL端用sq ...

  6. mysql 查询近三个月数据

    转载:https://www.cnblogs.com/nongzihong/p/11252553.html 最近在做数据可视化,有个查询近三个月的需求,故找到了这么一篇好的博文,转载用于自己参考学习! ...

  7. mysql查询近六个月的数据

    一.查询近六个月 SELECT date_format( @lastDay := last_day( date_add( @lastDay, INTERVAL 1 MONTH ) ), '%Y-%m' ...

  8. MySQL查询当前时间的前几天的数据

    查询5分钟前的数据 select * from table where end_date between date_add(now(), interval - 300 SECOND) and NOW( ...

  9. mysql统计一年12个月的数据,当某个月没数据的时候自动补0

    在mysql中如何去统计12个月的数据,并且给没有数据的月份设置为0 ? 因为每个人的业务都不太一样,所以如何统计数据这个就不说了,不过我相信能看到这篇文章的人应该都已经做好数据统计,只是统计的数据并 ...

最新文章

  1. 多样性计算时代,怎样的技术生态才能满足发展需求
  2. bookmark: partitioned tables in sql server 2005
  3. mysql 路由_mysql 命令大全
  4. 如何分表分库 Mycat 与shadingjdbc 区别? Mycat 是基于服务器端的形式实现数据库代理 基于服务器端的形式 改写sql语句 shadingjdbc 基于客户端 改写sql语
  5. php 把一个数组分成有n个元素的二维数组的算法
  6. 内存spd规范_C语言内存泄露很严重,如何应对?
  7. ubuntu 添加 qq
  8. 套接字初始化失败问题
  9. dcp9030cdn定影_兄弟Brother DCP-9030CDN打印机驱动(修复DCP-9030CDN打印机连接故障)V1.0 正式版...
  10. [数论][NOIP]解方程
  11. 大型网站架构技术的核心价值是随网站所需灵活应对
  12. android studio for android learning (二十八) android基础知识
  13. 手机端网页切图之间出现空白的问题
  14. python批量获取百度贴吧_python网络爬虫案例:批量爬取百度贴吧页面数据
  15. 3D视觉学习路线 + 路线规划
  16. 各种比例尺图幅号计算excel表格
  17. IP 伪装简易使用说明
  18. 我不想加班,您看我还有机会吗?
  19. Codeforces 407C--Curious Array
  20. 负反馈放大电路中自激振荡消除方法

热门文章

  1. 转:世上最愚蠢的行为,就是讲道理
  2. 基于STC89C52RC单片机的密码门锁
  3. “三地合作社”轧在农民心里的一道沟
  4. c语言switch语句中文,C语言switch语句问题。
  5. MATLAB - 八个常用函数入门标量函数可视化
  6. 非常简单的申请微软学生KEY的方法
  7. 天地图与Arcgis互调服务
  8. 深度学习Deep Learning 资料大全
  9. 移动端:M站和APP的区别
  10. 华为云PaaS平台微服务治理5云容器引擎CCE