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.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值