毕设之后台天数范围内成交趋势
情况描述:在统计近30天、7天等在一个范围内的数据时,如果数据库中没有某些天的数据时,需要自己封装这些日期,并设置数量为0。但是每天的日期是动态发生变化的不是死的。
例如我要查询3/01 ~ 3/31 之间每天的订单量,可是我是一个小网站,可能3/05 3/08 3/09... 等某些天中根本没有人下单,那我这些天的数据根本查询不到。
想过循环嵌套,外部遍历日期集合,内部遍历SQL的查询结果,比对日期。如果哪天没有数据 ==null,直接给0。发现太耗时了需要每次都得从头比较。不能够保证顺序。需要自己判定那一天没有数据。
随即就立马想到了不如把已存在的数据集合存到二叉树(红黑树更好)里,以日期为key,销量/收入等存为value。这样只需要遍历一次日期集合(有序的),内部通过日期就直接获取到相关的信息,不需要二次遍历,且二叉树的查找也快,如果为空就直接设置为0。
首先自己先封装了一个方法,用于获取给定数字的日期范围集合,比如今天是3/12,输入7,返回的集合就是从3/5 ~ 3/11
/**
* 获取天数范围内的日期集合
* @param objDay 范围值 例如7天、30天
*/
private List<String> getQueryDate(int objDay){
List<String> queryDate = new ArrayList<>();
//昨天的日期
LocalDateTime endDate = LocalDateTime.now().minusDays(1);
LocalDateTime startDate = endDate.minusDays(objDay - 1);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
//遍历日期
for (;!startDate.isAfter(endDate);startDate = startDate.plusDays(1)){
queryDate.add(dateTimeFormatter.format(startDate));
}
return queryDate;
}
接下来就是根据返回的日期范围查询结果集,并生成二叉树,最后循坏赋值
//日期集合
List<String> queryDateList = getQueryDate(queryDay);
//结果集合
validOrders = ordersMapper.queryOrderAmountInRecentOneMonth(queryDateList);
//想办法把结果集弄好 试试二叉树 -> 已完成
BinaryTree binaryTree = new BinaryTree();
validOrders.forEach(item -> {
binaryTree.insert(item.getXDate(),item.getOrderNum());
});
validOrders.clear();
queryDateList.forEach(curDate -> {
//没有找到
Object curNum = binaryTree.get(curDate);
if (curNum == null){
validOrders.add(new ValidOrder(0,curDate.substring(curDate.indexOf("/") + 1)));
}else {
log.info("orderNum:{},curDate:{}", curNum,curDate.substring(curDate.indexOf("/") + 1));
validOrders.add(new ValidOrder((int)curNum,curDate.substring(curDate.indexOf("/") + 1)));
}
});
红黑树自平衡,更优秀。小白乱写总结,勿喷