java 1分钟的数据实现以5分钟为粒度的折线图,什么数据还不连续 ~~

Posted NewWorldForU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 1分钟的数据实现以5分钟为粒度的折线图,什么数据还不连续 ~~相关的知识,希望对你有一定的参考价值。

这里写目录标题

需求

老规矩先说需求:(本次偏业务)
监测某数据A、B,展现当前时间前24小时之内的折线图,5分钟粒度。

对于需求的思考

首先是数据长什么样。
存储的数据是1分钟粒度存的。

但并不是每分钟都有,所以如果直接用sql查出来5分钟粒度的会有时间段没有数据,导致时间不连贯。

实现

在网上找了很多资料,并且询问了大佬之后,有了思路。

第一步:初始化横坐标数据
第二步:将真实数据求出来
第三步:将真实数据中的数据替换初始化的数据

初始化横坐标:

    static List<String> initializeList(Date date) 
        Date start = dayStartDate(date);//转换为天的起始date
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");

        List<String> result = new ArrayList<String>();
        while (start.compareTo(date) < 0) 
            String format = sdf.format(start);
            result.add(format);
            //日期加5分钟
            start = addFiveMin(start, 5);
        

        return result;
    

    private static Date addFiveMin(Date start, int offset) 
        Calendar c = Calendar.getInstance();
        c.setTime(start);
        c.add(Calendar.MINUTE, offset);
        return c.getTime();
    

    private static Date dayStartDate(Date date) 
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DATE, -1);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);

        int minute = c.get(Calendar.MINUTE);
        while (minute % 5 != 0) 
            minute++;
        
        c.set(Calendar.MINUTE, minute);
        return c.getTime();
    

查询真实数据

SELECT
	max( device_uid ) deviceUid,
	sum( traffic_flow ) trafficFlow,
	avg( video_quality ) videoQuality,
	sum( event_count ) eventCount,
	max( analysis_state ) analysisState,
	DATE_FORMAT( dataStartTime, '%Y-%m-%d %H:%i' ) countTime 
FROM
	(
	SELECT
		device_uid,
		traffic_flow,
		video_quality,
		count_time,
		event_count,
		analysis_state,
		DATE_FORMAT(
			concat(
				date( count_time ),
				' ',
				HOUR ( count_time ),
				':',
				floor( MINUTE ( count_time )/ 5 )* 5 ), '%Y-%m-%d %H:%i' ) AS dataStartTime
					FROM converge_analysis WHERE device_id = "123123"
				AND count_time > DATE_SUB( NOW(), INTERVAL + 1 DAY ) ) a 
			GROUP BY
				DATE_FORMAT( dataStartTime, '%Y-%m-%d %H:%i' ) 
		ORDER BY
	countTime

替换数据

效果


花絮

当然其中不是一帆风顺的,有一个BUG,导致整个折线图蹦迪。


百思不得其解,最后发现是横坐标搞的鬼,初始化横坐标是以当前时间前5分钟为纬度的时间轴,而查出来的数据是以5的倍数的时间轴。

												————  What is worth doing is worth doing well.

以上是关于java 1分钟的数据实现以5分钟为粒度的折线图,什么数据还不连续 ~~的主要内容,如果未能解决你的问题,请参考以下文章

java 实现5分钟粒度的折线图还没数据??键盘给你,你来。

iOS 动画绘制线条颜色渐变的折线图

外汇MT4 平台 调节K线 周期调节 我想要10分钟K线图怎么调

如何使用c#设置日期时间图表的最小值和最大值?

ZABBIX监控每秒业务状态

echarts怎么做实时动态的折线图