java 按日期範圍統計資料並填補缺失日期資料
阿新 • • 發佈:2020-09-09
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); }
不用在意語法問題,關鍵看思路,難點在於從返回的資料中如何確定缺失的日期。
寫在最後
哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!