项目场景:

获取过去24小时每小时数据量(没有为0)


问题描述

时间段要求精确到分钟,即:10.33 ~ 11.33,11.33~12.33……


解决方案:

第一步:获取24个时间点:

1.使用数据量一定大于24的表(可以是数据库自带的,也可以是自己项目的)

SET @i=-1;
SELECT DATE_SUB( NOW(),INTERVAL ( (@i:=@i+1) ) HOUR ) AS 'time' 
FROM  mysql.help_category 
WHERE @i<23

2.建一个24个数据量的表

SET @i=-1;
SELECT DATE_SUB( NOW(), INTERVAL((@i:=@i+1)) HOUR) AS 'time' 
FROM 
(SELECT *  FROM 
	(SELECT '1' AS a UNION SELECT '2' UNION SELECT '3' UNION SELECT '4'   ) AS a
 	JOIN 
	( SELECT  '1' UNION  '2' UNION SELECT '3' UNION SELECT '4' UNION SELECT '5' UNION SELECT '6' ) AS b
 ) AS c 
 WHERE @i<23

NOW() 获取当前时间,也是最后一个时间节点
DATE_SUB() 函数从日期减去指定的时间间隔
INTERVAL 关键字可以用于计算时间间隔
HOUR 间隔类型(小时)
使用格式:DATE_SUB(date,INTERVAL expr type)

获取的时间点如下:
查询结果

第二步:将要查询的表的时间向右偏移至整点,并查询时段内数据量:

将10.33 ~ 11.33之间的数据的时间,显示为:11.00~12.00
这样小时为11的数据就是原数据库中10.33 ~ 11.33的数据,方便之后的查询

SELECT DATE_FORMAT(DATE_SUB( create_time,INTERVAL MINUTE(NOW())-60 MINUTE ) ,'%Y-%m-%d %H') AS date, count(*) AS num 
FROM mytable GROUP BY date

结果如下:
查询结果

第二步:多表连接查询:

SET  @i=-1;
SELECT t.time, ifnull(num,0) AS count FROM 
	(SELECT DATE_SUB( NOW(),INTERVAL ( (@i:=@i+1) ) HOUR ) AS 'time' 
	FROM  mysql.help_category where @i<23) 
AS t 
LEFT JOIN 
	(SELECT DATE_FORMAT(DATE_SUB( create_time,INTERVAL MINUTE(NOW())-60 MINUTE ) ,'%Y-%m-%d %H') AS date, count(*) AS num 
	FROM mytable GROUP BY date ) 
AS sa 
ON sa.date = DATE_FORMAT( t.time,'%Y-%m-%d %H')  GROUP BY t.time

结果如下:
查询结果
count表示的是时间节点前一个小时的数据量,不包含此节点,如果要包含此节点,可以将上面的60改成59

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐