MySQL查询近7天、1年、5年内数据,无数据部分补0
概述
需求为查询数据库中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-15
至2021-12-21
,其中有12-18
至12-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相关推荐
- MySQL查询近12个月数据,无则补0
查询近12个月数据,无则补0 select v.month,ifnull(b.count,0) count from (SELECT DATE_FORMAT(CURDATE(), '%Y-%m') A ...
- mysql 查询某个日期时间段,每天同一时间段的数据
mysql 查询某个日期时间段,每天同一时间段的数据: SELECT * FROM t_a01_eltable WHERE DATE_FORMAT(acqtime,'%Y-%m-%d')>='2 ...
- mysql 查询近几天的数据
前言 mysql 需求:查询近30天的文章 查询近30天的文章 SELECT * FROM article WHERE pubTime >= NOW( ) - INTERVAL 30 DAY 注 ...
- mysql 查询近两周的记录_查询近一周、近两周的数据
一.利用mysql函数TO_DAYS,通过该函数计算返回的是天数 示例:查询近一周的数据 select * from table where TO_DAYS(NOW()) - TO_DAYS(fiel ...
- 你会不会用mysql查询近7个月的数据?没有记录默认为空
版权声明:欢迎转载,请注明沉默王二原创. https://blog.csdn.net/qing_gee/article/details/68059203 做报表统计的时候,常常需要在MySQL端用sq ...
- mysql 查询近三个月数据
转载:https://www.cnblogs.com/nongzihong/p/11252553.html 最近在做数据可视化,有个查询近三个月的需求,故找到了这么一篇好的博文,转载用于自己参考学习! ...
- mysql查询近六个月的数据
一.查询近六个月 SELECT date_format( @lastDay := last_day( date_add( @lastDay, INTERVAL 1 MONTH ) ), '%Y-%m' ...
- MySQL查询当前时间的前几天的数据
查询5分钟前的数据 select * from table where end_date between date_add(now(), interval - 300 SECOND) and NOW( ...
- mysql统计一年12个月的数据,当某个月没数据的时候自动补0
在mysql中如何去统计12个月的数据,并且给没有数据的月份设置为0 ? 因为每个人的业务都不太一样,所以如何统计数据这个就不说了,不过我相信能看到这篇文章的人应该都已经做好数据统计,只是统计的数据并 ...
最新文章
- 多样性计算时代,怎样的技术生态才能满足发展需求
- bookmark: partitioned tables in sql server 2005
- mysql 路由_mysql 命令大全
- 如何分表分库 Mycat 与shadingjdbc 区别? Mycat 是基于服务器端的形式实现数据库代理 基于服务器端的形式 改写sql语句 shadingjdbc 基于客户端 改写sql语
- php 把一个数组分成有n个元素的二维数组的算法
- 内存spd规范_C语言内存泄露很严重,如何应对?
- ubuntu 添加 qq
- 套接字初始化失败问题
- dcp9030cdn定影_兄弟Brother DCP-9030CDN打印机驱动(修复DCP-9030CDN打印机连接故障)V1.0 正式版...
- [数论][NOIP]解方程
- 大型网站架构技术的核心价值是随网站所需灵活应对
- android studio for android learning (二十八) android基础知识
- 手机端网页切图之间出现空白的问题
- python批量获取百度贴吧_python网络爬虫案例:批量爬取百度贴吧页面数据
- 3D视觉学习路线 + 路线规划
- 各种比例尺图幅号计算excel表格
- IP 伪装简易使用说明
- 我不想加班,您看我还有机会吗?
- Codeforces 407C--Curious Array
- 负反馈放大电路中自激振荡消除方法