Wpadłem na tę samą potrzebę i zacząłem od odpowiedzi @alain.janinm, która jest dobra, ale w niektórych przypadkach nie daje dokładnie tego samego wyniku.
np :
Rozważ miesiące od 17.02.2013 do 11.03.2016 ("dd/MM/yyyy"
)
Wynik Oracle:36,8064516129032
Metoda Java z @Alain.janinm odpowiedź:36.74193548387097
Oto zmiany, które wprowadziłem, aby uzyskać bliższy wynik months_between()
Oracle funkcja :
public static double monthsBetween(Date startDate, Date endDate){
Calendar cal = Calendar.getInstance();
cal.setTime(startDate);
int startDayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
int startMonth = cal.get(Calendar.MONTH);
int startYear = cal.get(Calendar.YEAR);
cal.setTime(endDate);
int endDayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
int endMonth = cal.get(Calendar.MONTH);
int endYear = cal.get(Calendar.YEAR);
int diffMonths = endMonth - startMonth;
int diffYears = endYear - startYear;
int diffDays = endDayOfMonth - startDayOfMonth;
return (diffYears * 12) + diffMonths + diffDays/31.0;
}
Dzięki tej funkcji wynik wywołania dla dat 17.02.2013 i 11.03.2016 to:36.806451612903224
Uwaga :Z mojego zrozumienia months_between()
Oracle funkcja uwzględnia, że wszystkie miesiące trwają 31 dni