1. 程式人生 > >java實現oracle的months_between函式

java實現oracle的months_between函式

最近在使用H2記憶體資料庫,在將oracle中的SQL轉換為H2中的SQL時,有些函式H2不存在,幸好H2支援自定義函式 ,於是自己使用日曆寫了下面這個仿oracle的months-between函式:

 

public static double monthsBetween(Date start,Date end){

        Calendar startCalendar = Calendar.getInstance();
        startCalendar.setTime(start);
        Calendar endtCalendar = Calendar.getInstance();
        endtCalendar.setTime(end);

        int startYear = startCalendar.get(Calendar.YEAR);
        int endYear = endtCalendar.get(Calendar.YEAR);
        int startMonth = startCalendar.get(Calendar.MONTH);
        int endMonth = endtCalendar.get(Calendar.MONTH);
        int startDay = startCalendar.get(Calendar.DATE);
        int endDay = endtCalendar.get(Calendar.DATE);
        int startHour =startCalendar.get(Calendar.HOUR_OF_DAY);
        int startMinute = startCalendar.get(Calendar.MINUTE);
        int startSecond = startCalendar.get(Calendar.SECOND);
        int endHour =endtCalendar.get(Calendar.HOUR_OF_DAY);
        int endMinute = endtCalendar.get(Calendar.MINUTE);
        int endSecond = endtCalendar.get(Calendar.SECOND);

        double result = (startYear*12+startMonth) - (endYear*12+endMonth);
        int countDay = ((startDay * 24) - (endDay * 24))/24;

        double countHourDay = (startHour - endHour)/24d;
        double countMinuteDay = (startMinute - endMinute)/(60d*24d);
        double countSecondDay = (startSecond - endSecond)/(60d*24d*60d);
        double factor = (1d/31d);
        result += countDay * factor;
        result += countHourDay * factor;
        result += countMinuteDay * factor;
        result += countSecondDay * factor;
        return result;
}