1. 程式人生 > >統計兩個日期之間的資料(平均數,總數。。。),無資料也要顯示日期資料預設顯示為0。

統計兩個日期之間的資料(平均數,總數。。。),無資料也要顯示日期資料預設顯示為0。

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