java补全数据库查询统计数据缺失的日期和补0

一. 需求描述

需求:获取近七日柱状图统计数据。

一般实现:从数据库通过分组等方式查出每天的数据,但是如果某天没产生数据记录,那么柱状图就缺失了当天的数据显示;实际如果当天没数据柱状图应该显示0才对。 

二. 实现步骤 

 假如:今天是2024-02-06号(需求是同样是获取近七日柱状图统计数据

  • 数据库返回的数据为:
{
    "date":["2024-02-03", "2024-02-05"}, 
    "value":[22, 55]
]
  • 我们期望的数据格式为:
{
    "date": ["2024-01-31", "2024-02-01", "2024-02-02", "2024-02-03", "2024-02-04", "2024-02-05", "2024-02-06"],
    "value": [0, 0, 0, 22, 0, 55, 0]
}
  • 如何将数据库返回的数据转换为我们期望的数据格式:

        调用以下方法即可:fillDateUtil(7, values, dates);

三. 通过java代码实现日期补全

    /**
     * 填充缺失的日期数据
     * @author qizhentao
     * @date 2024/2/6 17:35
     * @param dayNumber 获取今日往前推${dayNumber}天的所有日期集合。 例如当前日期为2024-01-07那么dayNumber=7将得到:[2024-01-01, 2024-01-02, 2024-01-03, 2024-01-04, 2024-01-05, 2024-01-06, 2024-01-07]
     * @param yDataList 原始Y轴数据集合。例如:[30, 55]
     * @param xDateList 原始X轴日期集合。例如:[2024-02-03, 2024-02-05]
     * @deprecated 如上案例,最终会按照dayNumber给定的日期顺序重组原始数据。
     */
    private static void fillDateUtil(int dayNumber, List yDataList, List xDateList) {
        // 获取近${dayNumber}日所有的日期,也是柱状图X轴要显示的日期。
        List<String> days = days(dayNumber);

        // 1.无数据,补充全部日期下的数据。
        if (xDateList.size() == 0){
            for (int i = 0; i < days.size(); i++) {
                xDateList.add(i, days.get(i));
                yDataList.add(i, "0");
            }
            return;
        }
        // 2.补充前位缺失
        for (int i = 0; i < xDateList.size(); i++) {
            if (!xDateList.get(i).equals(days.get(i))){
                xDateList.add(i, days.get(i));
                yDataList.add(i, "0");
            }
        }
        // 3.补充后位缺失
        if (xDateList.size() < days.size()){
            for (int i = xDateList.size(); i < days.size(); i++) {
                xDateList.add(i, days.get(i));
                yDataList.add(i, "0");
            }
        }

    }

    /**
     * 获取指定天数每日的日期(也是柱状图X轴要显示的日期。)<br>
     *     假如今日是2024-02-06号<br>
     *     当参数day=7时,则返回:[2024-01-31, 2024-02-01, 2024-02-02, 2024-02-03, 2024-02-04, 2024-02-05, 2024-02-06]
     */
    private static List<String> days(int day){
        Date date = new Date();
        List<String> list = new ArrayList<>();
        for (int i = day - 1; i >= 0 ; i--) {
            list.add(DateUtil.offsetDay(date, -i).toDateStr());
        }
        return list;
    }

四. main方法测试看看结果

public static void main(String[] args) {
        // 1.需求:获取近七日柱状图数据
        int dayNumber = 7;


        // 2.例如:从数据库只查出来2天的数据
        List<String> xDateList = new ArrayList();
        xDateList.add("2024-02-03");
        xDateList.add("2024-02-05");

        List<String> yDataList = new ArrayList();
        yDataList.add("22");
        yDataList.add("55");


        // 3.空位数据补充
        fillDateUtil(dayNumber, yDataList, xDateList);

        System.out.println(yDataList.toString());
        System.out.println(xDateList.toString());
        /*
            当前日期为2024-02-06
            输出打印:
              [0, 0, 0, 22, 0, 55, 0]
              [2024-01-31, 2024-02-01, 2024-02-02, 2024-02-03, 2024-02-04, 2024-02-05, 2024-02-06]
         */
    }

补充

获取指定天数每日的日期方法中的 DateUtil.offsetDay()  日期偏移方法用的hutool工具类,也可自己实现此方法,或引入hutool依赖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祁_z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值