最近公司项目有个需求,需要查询某个表本周和上周的量并且分组。我的解决思路是:根据当前时间找到起始时间 上周周一 00:00:00 以及 截止时间 本周周末 23:59:59,查出数据后再分组返回给前端。实体类时间数据类型是LocalDateTime,数据库是时间戳类型
上代码:
后端实现
Map<String, List<Integer>> map = new HashMap<>(); //上周数据 int[] lastWeekAlarm = new int[7]; //本周数据 int[] theWeekAlarm = new int[7]; LocalDateTime now = LocalDateTime.now(); DateTimeFormatter start = DateTimeFormatter.ofPattern("yyyy-MM-dd 00:00:00"); DateTimeFormatter end = DateTimeFormatter.ofPattern("yyyy-MM-dd 23:59:59"); String beginTime = now.minusWeeks(1).minusDays(now.getDayOfWeek().getValue()-1).format(start); //上周末 String midTime = now.minusWeeks(1).plusDays(7- now.getDayOfWeek().getValue()).format(end); String endTime = now.plusDays(7- now.getDayOfWeek().getValue()).format(end); getAlarmList(stationId, Timestamp.valueOf(beginTime), Timestamp.valueOf(endTime)).forEach(alarm -> { int index = alarm.getAlarmTime().getDayOfWeek().getValue() - 1; //比较如果大于0说明是本周数据 否则是上周的数据 if(alarm.getAlarmTime().toString().compareTo(midTime) > 0){ theWeekAlarm[index] += 1; }else { lastWeekAlarm[index] += 1; } }); //int数组转换为Integer的list map.put("lastWeekAlarm", Arrays.stream(lastWeekAlarm).boxed().collect(Collectors.toList())); map.put("theWeekAlarm", Arrays.stream(theWeekAlarm).boxed().collect(Collectors.toList())); return map;
前端实现
const date = new dayjs(); //获取当前时间的星期数 const week = date.day(); //上周数据数组 let thisWeek = [0,0,0,0,0,0,0]; //本周数据数组 let lastWeek = [0,0,0,0,0,0,0]; //上周一 const start = date.subtract(6 + week, 'day').format('YYYY-MM-DD 00:00:00.0'); //上周末 const mid = date.subtract(week, 'day').format('YYYY-MM-DD 23:59:59.999'); //本周末 const end = date.add(7 - week, 'day').format('YYYY-MM-DD 23:59:59.999'); this.alarmList.forEach(item => { //判断是否是在上周开始日期到本周结束日期之间 if(new Date(item.alarmTime) > new Date(start) && new Date(item.alarmTime) < new Date(end)){ let index = new dayjs(item.alarmTime).day() - 1; //时间大于上周末说明是本周数据 if(new Date(item.alarmTime) > new Date(mid)){ thisWeek[index] += 1; }else { lastWeek[index] += 1; } } }) this.lineChartData['theWeekAlarm'] = thisWeek; this.lineChartData['lastWeekAlarm'] = lastWeek;this.alarmList是调用后端接口查询出来的结果
我使用的是vue,lineChartData对象得提前声明好对应的数组属性,例如theWeekAlarm,不然赋值的时候无效
以上就是我的思路,大家有什么更好的思路可以评论区说明