最近公司项目有个需求,需要查询某个表本周和上周的量并且分组。我的解决思路是:根据当前时间找到起始时间 上周周一 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,不然赋值的时候无效
以上就是我的思路,大家有什么更好的思路可以评论区说明
1954

被折叠的 条评论
为什么被折叠?



