1. 程式人生 > 實用技巧 >java 按日期範圍統計資料並填補缺失日期資料

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);
}

  不用在意語法問題,關鍵看思路,難點在於從返回的資料中如何確定缺失的日期。  

寫在最後

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

相關推薦: