查询每月每天的订单总数与订单金额并补全日期

本人也是菜鸟级别的。前一段时间做一个项目。遇到了一个需求。客户选择月月份,就会把选择的月份的每天所有订单的总数或者金额返回给前端。但是遇到了一个问题,比如,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);
}
下面是查出来的数据,写的不是很好。给一些像我一样的菜鸟。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值