統計兩個日期之間的資料(平均數,總數。。。),無資料也要顯示日期資料預設顯示為0。
阿新 • • 發佈:2019-02-02
JAVA開發時有這麼一個需求:給一個開始時間和一個結束時間,顯示這段時間內每一天的資料,這個SQL語句並不大難(用一個GROUP BY就可以搞得定),關鍵點在於前臺頁面要顯示折線圖,所以沒有資料時日期也是要顯示的。在網上查了很多資料後,現總結如下,方便自己,也給大家提供一個思路。 因為我是從C轉行做JAVA的(坑爹的公司!),剛學JAVA,請大佬輕噴。。。
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class DataCompletion { //結果集合 private static ArrayList<DataValue> dateResult = new ArrayList<>(); public static void main(String args[]){ //缺少11、13、14、15、19(從2018-06-11到2018-06-20, 完全顯示時應該是 11,12, 13, 14, 15, 16, 17, 18, 19) DataValue d = new DataValue(); d.setTime("2018-06-12"); d.setValue(1.0); DataValue d2 = new DataValue(); d2.setTime("2018-06-18"); d2.setValue(1.0); DataValue d3 = new DataValue(); d3.setTime("2018-06-16"); d3.setValue(1.0); List<DataValue> a = new ArrayList<>(); a.add(d); a.add(d2); a.add(d3); List<DataValue> c = new ArrayList<>(); Map<String, String> b = new HashMap<>(); b.put("type", "day"); b.put("startTime", "2018-06-11"); b.put("endTime", "2018-06-20"); c = getDataCompletion(a, b); } public static List<DataValue> getDataCompletion (List<DataValue> beforList, Map<String, String> paraMap) { Date dateBegin, dateEnd; int days= 0; Calendar calendar10 = Calendar.getInstance(); Calendar calendar5 = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { dateBegin = sdf.parse(paraMap.get("startTime")); dateEnd = sdf.parse(paraMap.get("endTime")); /* * 計算開始時間和結束時間之間有幾天 * 如果想顯示 01, 02, 03 三天的資料 結束日期需要傳04, 因為01日 00:00 -- 04日 00:00 並不包括04 */ days = (int) ((dateEnd.getTime() - dateBegin.getTime()) / (1000*3600*24)); calendar10.setTime(dateBegin); } catch (java.text.ParseException e) { e.printStackTrace(); } //迴圈處理日期資料,把缺失的日期補全。days是時間段內的天數, beforList.size()是要處理的日期集合的天數 for (int curr = 0; curr < days; curr++) { boolean dbDataExist = false; int index = 0; for(int i = 0 ; i < beforList.size() ; i++){ try { DataValue testaa = beforList.get(i); Date date2 = sdf.parse(testaa.getTime()); calendar5.setTime(date2); } catch (ParseException e) { e.printStackTrace(); } if(calendar10.compareTo(calendar5) == 0){ dbDataExist = true; index = i; break; } } if(dbDataExist){ DataValue testbb = beforList.get(index); dateResult.add(testbb); }else{ DataValue testbb = new DataValue(); testbb.setTime(sdf.format(calendar10.getTime())); testbb.setValue(0.0); dateResult.add(testbb); } //修改外層迴圈變數, 是calendar10 +1天, 一天後的日期 calendar10.add(Calendar.DAY_OF_MONTH, 1 ); } //列印結果 for(DataValue str : dateResult){ System.out.println(str); } return dateResult; } } class DataValue { private String time; private Double value; public String getTime() { return time; } public void setTime(String time) { this.time = time; } public Double getValue() { return value; } public void setValue(Double value) { this.value = value; } @Override public String toString() { return "DataValue{" + "time='" + time + '\'' + ", value=" + value + '}'; } }
這個是個單例,直接拷貝下來儲存為:DataCompletion.java 直接執行就可以看到結果
時間較緊,請大佬們不要在意變數的命名。。。。 另外我在傳參的時候多傳了一個type,這個小例子沒有用到,本意是想實現天型別或者月型別的,上面的只實現了天型別的,感興趣的同學可以自己實現下月型別的(就是傳2018-06-11 --- 2018-10-01, 返回 06, 07, 08, 09 月型別的資料。)
參考博文:
http://www.xuebuyuan.com/679587.html
https://www.cnblogs.com/zhongzheng123/p/5230707.html
https://bbs.csdn.net/topics/390673766
https://www.zybang.com/question/45b8d739d4d860181eb371f438a6335b.html