查询每月每天的订单总数与订单金额并补全日期
本人也是菜鸟级别的。前一段时间做一个项目。遇到了一个需求。客户选择月月份,就会把选择的月份的每天所有订单的总数或者金额返回给前端。但是遇到了一个问题,比如,1月2号,没有订单的话,那就没有1月2号的字段。也没有订单总数与金额。但是前端需要。没有的话前端不好展示,要补齐日期,总数与金额设置为0。查了很多方法。都不尽人意,自己尝试写了,也算实现了。对于日期,有一种简单的方法,就是建一个时间表,连表查询。我是根据前端创过来的时间段后端自己组装时间。
mysql自己网上看了别人的写的,有点复杂。其实想想可以用开始时间与结束时间来查。但是只要效果有了。我也就没有改。
<!--查询每月每天的订单总金额--> <select id="selectOrderByMoney" resultType="com.rbu.entity.extention.OrderEnyityModel"> SELECT sum(t.totalmoney) as totalmoney ,substr(t.deductTime, 1, 10) as monthDay FROM(SELECT deduct.deduct_Time AS deductTime,deduct.deduct_money AS totalmoney FROM custom_order AS cd LEFT JOIN deduct ON cd.order_id = deduct.order_id where deduct.user_id = #{userId} GROUP BY deduct.order_id ) t WHERE t.deductTime LIKE concat( #{deductTime},'%') GROUP BY substr(t.deductTime, 1, 10) </select>
totalmoney是每月每天的总金额字段,monthDay是时间字段。
<!--查询每月每天订单的总数--> <select id="selectOrderByNumber" resultType="com.rbu.entity.extention.OrderEnyityModel"> SELECT count(*) as ordersTotal, substr(t.deductTime, 1, 10) as monthDay FROM ( SELECT cd.order_id, cd.order_No, cd.user_id, deduct.deduct_Time AS deductTime, deduct.deduct_money AS money FROM custom_order AS cd LEFT JOIN deduct ON cd.order_id = deduct.order_id where deduct.user_id = #{userId} GROUP BY deduct.order_id ) t WHERE t.deductTime LIKE concat( #{deductTime},'%') GROUP BY substr(t.deductTime, 1, 10) </select>ordersTotal是每月每天的订单的总数,monthDay是时间字段。
主要的来了。
/** * 得到一个月多少天 * @param date * @return */ public static int getDayNum(String date){ int dayCount; String[] strs = date.split("-"); int years = Integer.parseInt(strs[0]); int mon = Integer.parseInt(strs[1]) - 1; Calendar cl= Calendar.getInstance();//实例化一个日历对象 cl.set(Calendar.YEAR,years);//年 cl.set(Calendar.MONTH,mon);// dayCount=cl.getActualMaximum(Calendar.DATE);//得到一个月最大的一天就是一个月多少天 return dayCount; }
调这个方法传入参数比如“2017-08”,就可以等到2017年8月一共多少天。
下面这一段是
得到每月每天订单的金额
int days = CreateSessionUtil.getDayNum(date);//某年某月的天数。date参数是前端传给我的时间。 String[] mDay = new String[days];//创建一个时间数组 String[] strs = date.split("-");//通过“-”把时间截取成一个数组 String years = strs[0];//得到年 String month = strs[1];//得到月 BigDecimal bigDecimal = new BigDecimal(0);//这个是用来给总金额赋值的。为0 List<OrderEnyityModel> list = new ArrayList<OrderEnyityModel>(days);//这个集合是用来装返回给前端的数据的 List<OrderEnyityModel> orderEnyityModels = deductEntityMapper.selectOrderByMoney(date,userId);//这个是我数据库去查出来的数据 for(int i = 0; i < days; i++) { OrderEnyityModel enyityModel = new OrderEnyityModel();//这个对象用来装时间字段与总金额 if (i < 9) {//当i<9 的话。就会等到比如2017-08-06这样的时间字段 mDay[i] = years + "-" + month + "-" + "0" + (i + 1);
//把时间与总金额赋给对象enyityModel enyityModel.setMonthDay(mDay[i]); enyityModel.setTotalMoney(bigDecimal); }else { mDay[i] = years + "-" + month + "-" + (i + 1);
//把时间与总金额赋给对象enyityModel
enyityModel.setMonthDay(mDay[i]);
enyityModel.setTotalMoney(bigDecimal);
}
for (OrderEnyityModel oe: orderEnyityModels) {//这里通过查出来的集合对象里面判断是否有时间字段,有这个字段说明
当天有订单产生,就给他赋值查出来的总金额给对象enyityModel,替换0. if(enyityModel.getMonthDay().equals(oe.getMonthDay())){ enyityModel.setTotalMoney(oe.getTotalMoney()); break; } }
list.add(enyityModel);//把赋值的对象给加入集合}
下面的是算每月每天订单的总数。我就不给注释,都差不多
int days = CreateSessionUtil.getDayNum(date);//某年某月的天数 String[] mDay = new String[days]; String[] strs = date.split("-"); String years = strs[0]; String month = strs[1]; List<OrderEnyityModel> list = new ArrayList<OrderEnyityModel>(days);
//查出来的订单总数 List<OrderEnyityModel> orderEnyityModels = deductEntityMapper.selectOrderByNumber(date,userId); for(int i = 0; i < days; i++) { OrderEnyityModel enyityModel = new OrderEnyityModel(); if (i < 9) { mDay[i] = years + "-" + month + "-" + "0" + (i + 1); enyityModel.setMonthDay(mDay[i]); enyityModel.setOrdersTotal(0); }else { mDay[i] = years + "-" + month + "-" + (i + 1); enyityModel.setMonthDay(mDay[i]); enyityModel.setOrdersTotal(0); } for (OrderEnyityModel oe: orderEnyityModels) { if(enyityModel.getMonthDay().equals(oe.getMonthDay())){ enyityModel.setOrdersTotal(oe.getOrdersTotal()); break; } }
list.add(enyityModel);}
下面是查出来的数据,写的不是很好。给一些像我一样的菜鸟。