要获取近7日的数据,但是数据库查询出来的时候,缺少某日的数据。
如09-03到09-09,但数据库中没有09-07的数据,所以查询的数据缺失09-07相关数值,需要在代码层面填充。
mysql获取近7日的数据
SELECT SUM(cost) AS cost,
DATE_FORMAT(time, '%Y-%m-%d') AS dateTime
FROM
orders
WHERE
DATE_SUB(CURDATE(), INTERVAL 6 DAY) <= date(time)
GROUP BY
DATE_FORMAT(time, '%Y-%m-%d');
sql语句处理不了,在代码层处理——
1.用Calendar来处理日期数组
/**
* 获取过去任意天内的日期数组
* @param intervals
* @return
*/
public static ArrayList<String> pastDaysList(int intervals) {
ArrayList<String> pastDaysList = new ArrayList<>();
for (int i = 0; i < intervals; i++) {
pastDaysList.add(getPastDate(i));
}
return pastDaysList;
}
/**
* 获取过去第几天的日期
*
* @param past
* @return
*/
public static String getPastDate(int past) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
Date today = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String result = format.format(today);
return result;
}
2.匹配日期并处理数值
public Map<String, Object> toWeekIncome(String area) {
List<Map<String, Object>> list = ordersDao.toWeekIncome(area);
//LinkedHashMap保证顺序
HashMap<String, Object> dayMap = new LinkedHashMap<>();
//获取近7日内日期数组
ArrayList<String> dateList = DateUtil.pastDaysList(7);
for (int i = 0; i < dateList.size(); i++) {
//初始化日期与数值
dayMap.put(dateList.get(i).substring(5), 0.00);
//循环匹配相关日期的数值
for (int j = 0; j < list.size(); j++) {
String s = dateList.get(i);
String dateTime = list.get(j).get("dateTime").toString();
if (s.equals(dateTime)) {
dayMap.put(dateList.get(i).substring(5), list.get(j).get("income"));
}
}
}
Map<String, Object> data = new HashMap<String, Object>();
data.put("xAxis", dayMap.keySet());
data.put("yAxis", dayMap.values());
return data;
}
接口获得数据格式