• java 按日期范围统计数据并填补缺失日期数据


    1.情景展示

      如上图所示,按日期进行数据统计,我们知道,数据的来源肯定是数据库,一旦指定时间段,必然存在日期空缺的情况(也就是当天没有产生数据) 

      除了使用SQL填补空缺日期记录外,有时我们不得不在java中做处理,填补空缺日期,并造当天的数据(最好还是使用SQL,实在实现不了再用java)

      这种情况也很常见,今天我们一起来看下,如何通过java填补空缺的数据,并返回给前端?

    2.解决方案

    /**
     * 开票统计(按天统计)
     */
    @GetMapping("czKptJ/days")// /ticket/index/czKptJ/days
    @ApiOperation("首页开票统计(走势图)")
    public Result<List<CzKpTjDays>> getczKptJByDays(){
        // 当前用户
        UserDetailBO currentUser = userHandler.getCurrentUser();
        // 查询条件
        List<CzKpTjDays> result = czKpTjDaysManager.lambdaQuery()
                .eq(CzKpTjDays::getOrgCode, currentUser.getOrgcode())
                .ge(CzKpTjDays::getKpDate,DateUtils.getForwardTowardDate(-6))
                .le(CzKpTjDays::getKpDate,DateUtils.getToday())
                .list();
    
        // 不够7天,说明日期存在空缺
        if (result.size() < 7) {
            // Step 1:从查询结果中提取日期
            List<LocalDate> resultDateList = new ArrayList<>(result.size());
            result.forEach(row ->{
                resultDateList.add(row.getKpDate());
            });
            // Step 2:获取当前时间的前7天时间,共7天
            LocalDate[] datesArray = {DateUtils.getForwardTowardDate(-6), DateUtils.getForwardTowardDate(-5), DateUtils.getForwardTowardDate(-4), DateUtils.getForwardTowardDate(-3), DateUtils.getForwardTowardDate(-2), DateUtils.getForwardTowardDate(-1), DateUtils.getToday()};
            // Step 3:array-->list
            List<LocalDate> addDateList = new ArrayList<>(Arrays.asList(datesArray));
            // Step 4:将查询结果中的日期排除在外
            addDateList.removeAll(resultDateList);
            // Step 5:准备将要填充的数据
            List<CzKpTjDays> addList = new ArrayList<>(addDateList.size());
            addDateList.forEach(date -> {
                addList.add(new CzKpTjDays().setKpDate(date).setFsKpTotal(new BigDecimal(0)).setMzKpTotal(new BigDecimal(0)).setZyKpTotal(new BigDecimal(0)).setOrgCode(currentUser.getOrgcode()));
            });
            // Step 6:添加到原有list中
            result.addAll(addList);
            // Step 7:冒泡排序
            for (int i = 0; i < result.size() - 1; i++) {
                for (int j = 1; j < result.size() - i; j++) {
                    CzKpTjDays czKpTjDays;
                    // 前面的日期大于后面的日期
                    if ((result.get(j - 1).getKpDate()).isAfter(result.get(j).getKpDate())) {
                        czKpTjDays = result.get(j - 1);
                        // 交换值
                        result.set((j - 1), result.get(j));
                        result.set(j, czKpTjDays);
                    }
                }
            }
        }
    
        return Results.succ(result);
    }
    

      不用在意语法问题,关键看思路,难点在于从返回的数据中如何确定缺失的日期。

    20200910

      关于最后的日期排序,其实可以不用这么复杂,直接利用java8的特性,即可实现升序排列

    // 数据按日期升序排列
    result.sort(new Comparator<CzKpTjDays>(){
        @Override
        public int compare(CzKpTjDays o1, CzKpTjDays o2) {
            return o1.getKpDate().compareTo(o2.getKpDate());
        }
    });
    

      List简单版

    public static void main(String[] args) {
    
        Integer[] numArray = {7,6,5,4,3,2,1};
        // Array-->List(泛型必须是封装类)
        List<Integer> numList = new ArrayList<>(Arrays.asList(numArray));
        // 我的list
        ArrayList<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(5);
        // 将numList所有元素添加到myList中
        myList.addAll(numList);
        System.out.println("myList集合:" + myList);
        // 利用set的唯一性特性进行去重
        HashSet<Integer> mySet = new HashSet<>();
        mySet.addAll(myList);
        System.out.println("mySet去重:" + mySet);
        // Set-->ArrayList
        ArrayList<Integer> newList = new ArrayList<>();
        newList.addAll(mySet);
        System.out.println("去重后的list:" + newList);
        // 升序排列(要想调用排序方法,必须使用ArrayList)
        newList.sort(Integer::compareTo);
        System.out.println("升序排列:" + newList);
    }
    

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    【opencv.js】将图片转换为灰度图
    【快速创建】第一个 opencv.js 项目
    【踩坑无数】Anaconda(2020.02) + Tensorflow2.1 + python3.7 (CPU版本)的安装
    Thread的join方法
    常用语句
    获取当前托管线程的唯一标识符
    修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限(转载)
    C#中Monitor和Lock以及区别(转载)
    LIBRA查询
    Select()和SelectMany()的区别
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/13639627.html
Copyright © 2020-2023  润新知