一般图表绘制例如echarts等,返回数据格式都大同小异。重点是利用sql或者java实现数据格式的转型,接下来是关键部分:

1.前提:提供的工具方法——获取某月有多少天

  1. //通过年份和月份确定该月的最后一天
  2. public static int getMaxDay(int year,int month ){
  3.  
  4. Calendar time=Calendar.getInstance();
  5. time.clear();
  6. time.set(Calendar.YEAR,year); //year 为 int
  7. time.set(Calendar.MONTH,month-); //month 为int
  8. return time.getActualMaximum(Calendar.DAY_OF_MONTH);
  9. }

2.mapper层sql语句书写

  1. <select id="getAllOrderCountByYearAndMonth" parameterType="pd" resultType="OrderCount" >
  2. SELECT
  3. sum(t.ordercount) ordercount,
  4. t.[month] month ,
  5. t.[day] day
  6. from
  7. order t
  8. where =
  9. <if test="year != null and year != ''">
  10. and t.year=convert(int, #{year})
  11. </if>
  12. <if test="month != null and month != ''">
  13. and t.month=convert(int, #{month})
  14. </if>
  15. GROUP BY
  16. t.[month],t.[day]
  17. HAVING
  18. =
  19. ORDER BY t.[day] asc
  20. </select>

3.service层实现,调用sql返回结果,及对其返回结果进行格式转换(重要)

  1. Map<String,String> resultMap = new HashMap<String,String>();
  2. //获取到数据库搜索的年份对应某月份的31天订单量
  3. List<OrderCount> orderCountList = orderCountManager.getAllOrderCountByYearAndMonth(pd);
  4. //确定某个月的天数(如果日期截止只要到有数据的最大日期,那么可以修改sql语句排列方式,例如,日期从大到小排列,那么就是位置在0上的数据是最大天数,很简单实现,此处不列出来了)
  5. int days = getMaxDay(Integer.parseInt(pd.get("year").toString()),Integer.parseInt(pd.get("month").toString()));
  6. //定义数组,默认都是0
  7. int[] countVIP = new int[days];
  8. //将获取到不同年份不同月份不同日期对应不同的订单量放在数组中
  9. if (orderCountList.size()> && orderCountList!=null) {
  10. for (int i=;i<orderCountList.size();i++) {
  11. OrderCount oc = orderCountList.get(i);
  12. //获取对应日期补充数据
  13. if(oc!=null){
  14. countVIP[oc.getDay()-] = oc.getOrderCount();
  15. }
  16. }
  17. }
  18. resultMap.put("orderStatistics", countVIP);

优化部分

接下来是后期我们的需求优化,即,数据只获取到当前日期,当前月之前月份日期数据要补充满,当前日期数据补充到下单截止日期;当前年份之前年份12个月要补全,当前年份数据补充到下单截止月份。具体如下:

  1. @Override
  2. public YJLResponseModel getOrderNewDayCountByYearAndMonth(String condtionStr) {
  3. setYjlResponseModel(new YJLResponseModel());
  4. PageData pageData = JSON.parseObject(condtionStr, PageData.class);
  5. //按年+月获取每一天数据
  6. List<PageData> orderCountList = ordOrderNewMapper.getOrderNewDayCountByYearAndMonth(pageData);
  7. //初始化====================
  8. //java获取当前年份
  9. Calendar cale = Calendar.getInstance();
  10. int currentYear = cale.get(Calendar.YEAR);
  11. int currentMonth= cale.get(Calendar.MONTH)+ ;
  12. //判断是否是当前年月,不是的话取满月,是的话,取当前截止日期
  13. int argYear = Integer.parseInt(pageData.getString("year"));
  14. int argMonth = Integer.parseInt(pageData.getString("month"));
  15. //定义最大天数,默认取满天
  16. int maxDays= getMaxDay(argYear,argMonth);
  17. //如果有数据,补充数据===================
  18. if(orderCountList!=null && orderCountList.size()>) {
  19. if (argYear == currentYear && argMonth == currentMonth) {
  20. //获取最后一天日期
  21. PageData lastDay = orderCountList.get(orderCountList.size() - );
  22. //获取截止天数
  23. maxDays = Integer.parseInt(lastDay.get("day").toString());
  24. }
  25. }
  26. //定义最大天数数组
  27. int[] count = new int[maxDays];
  28. int[] days = new int[maxDays];
  29. //补全日期到数组中
  30. for(int i=;i<maxDays;i++){
  31. days[i] = i+;
  32. }
  33. if(orderCountList!=null && orderCountList.size()>) {
  34. //将获取到不同年份不同月份不同日期对应不同的订单量放在数组中
  35. for (int i=;i<orderCountList.size();i++) {
  36. PageData oc = orderCountList.get(i);
  37. //获取对应天
  38. if(oc!=null){
  39. count[Integer.parseInt(oc.get("day").toString())-] = Integer.parseInt(oc.get("count").toString());
  40. }
  41. }
  42. }
  43. pageData.put("count",count);
  44. pageData.put("days",days);
  45. getYjlResponseModel().setData(pageData);
  46. getYjlResponseModel().setSuccess(true);
  47. return getYjlResponseModel();
  48. }
  49.  
  50. @Override
  51. public YJLResponseModel getOrderNewDayCountByYear(String condtionStr) {
  52. setYjlResponseModel(new YJLResponseModel());
  53. PageData pageData = JSON.parseObject(condtionStr, PageData.class);
  54.  
  55. //按年获取每一天数据
  56. List<PageData> orderCountList = ordOrderNewMapper.getOrderNewDayCountByYear(pageData);
  57. //初始化数据==============================
  58. //定义最大月数数组,默认除了当前年之前年是12个月,当期年是截止月
  59. //获取传参年数
  60. int argYear = Integer.parseInt(pageData.getString("year"));
  61. //java获取当前年份
  62. Calendar cale = Calendar.getInstance();
  63. int currentYear = cale.get(Calendar.YEAR);
  64. //定义某年月数,默认12
  65. int maxMonths = ;
  66. //优化数据,补充数据=======================
  67. if(orderCountList!=null && orderCountList.size()>){
  68. if(argYear==currentYear){
  69. //获取最后一个月份
  70. PageData lastMonth = orderCountList.get(orderCountList.size()-);
  71. //获取截止月份
  72. maxMonths= Integer.parseInt(lastMonth.get("month").toString());
  73. }
  74. }
  75. //定义返回数据格式,默认都是0
  76. int[] count = new int[maxMonths];
  77. int[] months = new int[maxMonths];
  78. //补全月份到数组中
  79. for(int i=;i<maxMonths;i++){
  80. months[i] = i+;
  81. }
  82. if(orderCountList!=null && orderCountList.size()>){
  83. //将获取到不同年份不同月份对应的订单量放在数组中
  84. for (int i=;i<orderCountList.size();i++) {
  85. PageData oc = orderCountList.get(i);
  86. //获取对应天
  87. if(oc!=null){
  88. count[Integer.parseInt(oc.get("month").toString())-] = Integer.parseInt(oc.get("count").toString());
  89. }
  90. }
  91. }
  92. pageData.put("count",count);
  93. pageData.put("month",months);
  94. getYjlResponseModel().setData(pageData);
  95. getYjlResponseModel().setSuccess(true);
  96. return getYjlResponseModel();
  97. }

报表统计——java实现查询某年某月每天数据,没数据补0的更多相关文章

  1. 报表统计——java实现查询某年12个月数据,没数据补0

    一般图表绘制例如echarts等,返回数据格式都大同小异.重点是利用sql或者java实现数据格式的转型,接下来是关键部分: 1.mapper层sql语句,返回统计好的月份与对应月份的数据. < ...

  2. java 获取 获取某年某月 所有日期(yyyy-mm-dd格式字符串)

    总结一些日期常用的代码,方便以后直接拿 <code> /** * java 获取 获取某年某月 所有日期(yyyy-mm-dd格式字符串) * @param year * @param m ...

  3. Java练习 SDUT-1160_某年某月的天数

    C语言实验--某年某月的天数 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入年和月,判断该月有几天? Input ...

  4. JAVA字符串格式化-String.format()的使用 【生成随机数补0操作】

    转: JAVA字符串格式化-String.format()的使用 常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的s ...

  5. mysql 查询近7天数据,缺失补0

    相信很多人的项目都有这种需求,就是查询近7天的记录,但是这7天总有那么几天是没数据的,所以缺失的只能补 0 下面的代码不知道能不能看懂,我简单的说一下思路 1)先查询红色字体的近7天,再转换成日期 2 ...

  6. sql server查询某年某月有多少天

    sql语句如下: ),) date from (),,)+'-01' day) t1, ( ) t2 ),) ),,)+'%' 查询结果如下: 2017年2月共有28天,查询出28条记录.

  7. Java中查询某个日期下所有时间段的数据

    除了利用时间段进行查询外,还有一个方法: 利用mybatis中的函数,将datetime转为date <if test="purch_date!= null and purch_dat ...

  8. Java获取某年某月的第一天

    Java获取某年某月的第一天 1.设计源码 FisrtDayOfMonth.java: /** * @Title:FisrtDayOfMonth.java * @Package:com.you.fre ...

  9. Java获取某年某月的最后一天

    Java获取某年某月的最后一天 1.设计源码 LastDayOfMonth.java: /** * @Title:LastDayOfMonth.java * @Package:com.you.free ...

随机推荐

  1. 变量声明关键字var ,let,const

    今天带大家了解的是比较有趣的几个变量声明关键字var,let,const. 我们在最初接触JS的时候,变量是我们重要的一个组成部分,在使用时规定必须要先进行声明,否则网页将会报错: console.l ...

  2. 消费者、生产者Java代码示例,wait

    箱子中的苹果代表资源,现在有消费者从箱子中拿走苹果,生产者往箱子中放苹果.代码如下: 资源--箱子中的苹果: public class Box { int size; int num; public ...

  3. python编写排列组合,密码生产功能

    python编写排列组合 python在编写排列组合是会用到  itertools 模块 排列 import itertools mylist = list(itertools.permutation ...

  4. pickle 序列化对象

    # 序列化对象 import pickle mylist=[[1,2,3,4,5,6,7],["abc","xyz","hello"],[1 ...

  5. POJ 1236 Network of Schools - 缩点

    POJ 1236 :http://poj.org/problem?id=1236 参考:https://www.cnblogs.com/TnT2333333/p/6875680.html 题意: 有好 ...

  6. HDU4289Control 无向图拆点最大流

    /* ** 无向图拆点,求最大流,最大流即为割点个数. */ #include <iostream> #include <cstdio> #include <cstrin ...

  7. HDU 6346 整数规划 二分图匹配最优解

    整数规划 原来的km+hunger跑法T了, 拿了一个新的板子, 新的写法是将这原来的找新的最小的d放在了上一次的残留图上,从而减小复杂度, 但是个人还不是很理解为什么最小的d下一次出现的位置一定是这 ...

  8. 杭电多校第九场 hdu6425 Rikka with Badminton 组合数学 思维

    Rikka with Badminton Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/O ...

  9. CodeM 资格赛 B 可乐 思维

      分析: 我们假设购买一种可乐p瓶,我们可以得到期望:p*(m/n*a[i]+(n-m)/n*b[i]),由这个式子我们可以看出唯一的变量是i,所以可以遍历i找出式子的最大值 #include &l ...

  10. box-sizing(CSS3)

    CSS3新增了盒模型box-sizing,属性值有下面三个: content-box 默认值,让元素维持W3C的标准盒模型.元素的宽度/高度(width/height)= 元素内容框宽度/高度(con ...