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

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

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

2.mapper层sql语句书写

<select id="getAllOrderCountByYearAndMonth" parameterType="pd" resultType="OrderCount" >
SELECT
sum(t.ordercount) ordercount,
t.[month] month ,
t.[day] day
from
order t
where =
<if test="year != null and year != ''">
and t.year=convert(int, #{year})
</if>
<if test="month != null and month != ''">
and t.month=convert(int, #{month})
</if>
GROUP BY
t.[month],t.[day]
HAVING
=
ORDER BY t.[day] asc
</select>

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

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

优化部分

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

@Override
public YJLResponseModel getOrderNewDayCountByYearAndMonth(String condtionStr) {
setYjlResponseModel(new YJLResponseModel());
PageData pageData = JSON.parseObject(condtionStr, PageData.class);
//按年+月获取每一天数据
List<PageData> orderCountList = ordOrderNewMapper.getOrderNewDayCountByYearAndMonth(pageData);
//初始化====================
//java获取当前年份
Calendar cale = Calendar.getInstance();
int currentYear = cale.get(Calendar.YEAR);
int currentMonth= cale.get(Calendar.MONTH)+ ;
//判断是否是当前年月,不是的话取满月,是的话,取当前截止日期
int argYear = Integer.parseInt(pageData.getString("year"));
int argMonth = Integer.parseInt(pageData.getString("month"));
//定义最大天数,默认取满天
int maxDays= getMaxDay(argYear,argMonth);
//如果有数据,补充数据===================
if(orderCountList!=null && orderCountList.size()>) {
if (argYear == currentYear && argMonth == currentMonth) {
//获取最后一天日期
PageData lastDay = orderCountList.get(orderCountList.size() - );
//获取截止天数
maxDays = Integer.parseInt(lastDay.get("day").toString());
}
}
//定义最大天数数组
int[] count = new int[maxDays];
int[] days = new int[maxDays];
//补全日期到数组中
for(int i=;i<maxDays;i++){
days[i] = i+;
}
if(orderCountList!=null && orderCountList.size()>) {
//将获取到不同年份不同月份不同日期对应不同的订单量放在数组中
for (int i=;i<orderCountList.size();i++) {
PageData oc = orderCountList.get(i);
//获取对应天
if(oc!=null){
count[Integer.parseInt(oc.get("day").toString())-] = Integer.parseInt(oc.get("count").toString());
}
}
}
pageData.put("count",count);
pageData.put("days",days);
getYjlResponseModel().setData(pageData);
getYjlResponseModel().setSuccess(true);
return getYjlResponseModel();
} @Override
public YJLResponseModel getOrderNewDayCountByYear(String condtionStr) {
setYjlResponseModel(new YJLResponseModel());
PageData pageData = JSON.parseObject(condtionStr, PageData.class); //按年获取每一天数据
List<PageData> orderCountList = ordOrderNewMapper.getOrderNewDayCountByYear(pageData);
//初始化数据==============================
//定义最大月数数组,默认除了当前年之前年是12个月,当期年是截止月
//获取传参年数
int argYear = Integer.parseInt(pageData.getString("year"));
//java获取当前年份
Calendar cale = Calendar.getInstance();
int currentYear = cale.get(Calendar.YEAR);
//定义某年月数,默认12
int maxMonths = ;
//优化数据,补充数据=======================
if(orderCountList!=null && orderCountList.size()>){
if(argYear==currentYear){
//获取最后一个月份
PageData lastMonth = orderCountList.get(orderCountList.size()-);
//获取截止月份
maxMonths= Integer.parseInt(lastMonth.get("month").toString());
}
}
//定义返回数据格式,默认都是0
int[] count = new int[maxMonths];
int[] months = new int[maxMonths];
//补全月份到数组中
for(int i=;i<maxMonths;i++){
months[i] = i+;
}
if(orderCountList!=null && orderCountList.size()>){
//将获取到不同年份不同月份对应的订单量放在数组中
for (int i=;i<orderCountList.size();i++) {
PageData oc = orderCountList.get(i);
//获取对应天
if(oc!=null){
count[Integer.parseInt(oc.get("month").toString())-] = Integer.parseInt(oc.get("count").toString());
}
}
}
pageData.put("count",count);
pageData.put("month",months);
getYjlResponseModel().setData(pageData);
getYjlResponseModel().setSuccess(true);
return getYjlResponseModel();
}

报表统计——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. Javabean及其在jsp中的应用

    Javabean及其在jsp中的应用 一.Javabean简介 用作JavaBean的类必须具有一个公共的.无参数的构造方法. JavaBean的属性与普通Java类的属性的概念不一样,JavaBea ...

  2. 【spring-boot 源码解析】spring-boot 依赖管理

    关键词:spring-boot 依赖管理.spring-boot-dependencies.spring-boot-parent 问题 maven 工程,依赖管理是非常基本又非常重要的功能,现在的工程 ...

  3. ABC133F - Colorful Tree

    ABC133FColorful Tree 题意 给定一颗边有颜色和权值的树,多次询问,每次询问,首先更改颜色为x的边的权值为y,然后输出u到v的距离. 数据都是1e5量级的. 思路 我自己一开始用树链 ...

  4. UVA-10004-Bicoloring二分图染色

    题意:给一张图,判断是不是二分图: 自己一开始不知道是二分图染色,理解的是任意三点不能互相连接 可能以后遇到这样的模型,可以往二分图想: 首先怎么判定一个图是否为二分图 从其中一个定点开始,将跟它邻接 ...

  5. codeforces 814 D. An overnight dance in discotheque (贪心+bfs)

    题目链接:http://codeforces.com/contest/814/problem/D 题意:给出奇数个舞者,每个舞者都有中心坐标和行动半径,而且这些点组成的园要么相互包含要么没有交集求,讲 ...

  6. Codeforces Round #383 (Div. 2) C. Arpa's loud Owf and Mehrdad's evil plan(dfs+数学思想)

    题目链接:http://codeforces.com/contest/742/problem/C 题意:题目比较难理解,起码我是理解了好久,就是给你n个位置每个位置标着一个数表示这个位置下一步能到哪个 ...

  7. x86_64 Linux 运行时栈的字节对齐

    前言 C语言的过程调用机制(即函数之间的调用)的一个关键特性(起始大多数编程语言也是如此)都是使用了栈数据结构提供的后进先出的内存管理原则.每一个函数的栈空间被称为栈帧,一个栈帧上包含了保存的寄存器. ...

  8. 【Offer】[8] 【中序遍历的下一个结点】

    题目描述 思路分析 Java代码 代码链接 题目描述 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. ...

  9. 如何在 Ubuntu 上安装 MongoDB

    MongoDB 是一个越来越流行的自由开源的 NoSQL 数据库,它将数据存储在类似 JSON 的灵活文档集中,这与 SQL 数据库中常见的表格形式形成对比. 你很可能发现在现代 Web 应用中使用 ...

  10. c语言实现双色球和大乐透

    头文件: #include<stdio.h> #include <stdlib.h> #include<string.h> #include <time.h& ...