mysql获取近7日(日期)、近6个月和近一年(月份)

mysql获取近7日(日期)、近6个月和近一年(月份)

概述:

​ 在日常的java开发中,我们可能会遇到根据时间统计数据做报表的情况,虽然可以通过java语言来实现报表的功能,但是为了优化代码,我们尽可能将该操作在数据库中实现。

​ 本篇笔记主要实现的知识点有:

  • 检索近7日的日期、近6个月和近一年的月份
  • 联合数据表实现报表统计,(无数据的日期或月份自动补0)

mysql实现检索近7日的日期、近6个月和近一年的月份

1、检索近7日的日期数据

SELECT
@s :=@s + 1 as `index`,
DATE(DATE_SUB(CURRENT_DATE, INTERVAL @s DAY)) AS `date`
FROM 
mysql.help_topic,
(SELECT @s := -1) temp
WHERE 
@s < 6
ORDER BY `date`

该笔记日期为2021.3.23,检索结果如下:

在这里插入图片描述

如果想更改检索的天数,可以通过修改where条件实现,上面代码仅展示检索近一周的操作。

(上述代码可直接复制使用,无需新建表,使用的是系统自带数据表)

2、检索近6个月和近一年的月份

SELECT 
@s :=@s + 1 as `index`,
DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL @s MONTH),'%Y-%m') AS `mon`
FROM 
mysql.help_topic,
(SELECT @s := -1) temp
WHERE 
@s < 5
ORDER BY mon

写该笔记月份为2021.3,检索结果如下:

当where条件中,@s < 5,检索结果为近6个月的月份信息,结果如下:

在这里插入图片描述

当where条件中,@s < 11,检索结果为近一年的月份信息,结果如下:

在这里插入图片描述

可根据自己想要的月份数量修改where条件得出符合要求的月份信息。

联合数据表实现报表统计,(无数据的日期或月份自动补0)

直接上代码:

SELECT t1.date,IFNULL(t2.SUM , 0) as sum
from
(SELECT
@s :=@s + 1 as `index`,
DATE(DATE_SUB(CURRENT_DATE, INTERVAL @s DAY)) AS `date`
FROM 
mysql.help_topic,
(SELECT @s := -1) temp
WHERE 
@s < 6
ORDER BY `date`) as `t1`
left join 
(SELECT 
DATE_FORMAT(create_date,'%Y-%m-%d') td,
COUNT(id) SUM
from test
where 
TO_DAYS(NOW())-TO_DAYS(create_date) <= 6
GROUP BY td ASC ) as `t2`
on t1.date = t2.td

上列left join中的第二个表是我自己创建的表格,根据时间进行了数据分组(数据为0时不显示),联表查询后数据为0时,也会自动填充上0

实现的结果如下:

在这里插入图片描述

代码中第一行的“ IFNULL ”操作,为实现无数据时自动填充0的关键,

其他操作即是通过left join on的操作进行两个表之间的联合查询

猜你喜欢

转载自blog.csdn.net/xiri_/article/details/115110704