Ik ben dezelfde behoefte tegengekomen en begon met het antwoord van @alain.janinm, wat goed is, maar in sommige gevallen niet exact hetzelfde resultaat geeft.
ex :
Overweeg maanden tussen 17/02/2013 en 11/03/2016 ("dd/MM/yyyy"
)
Oracle-resultaat:36,8064516129032
Java-methode van @Alain.janinm antwoord:36.74193548387097
Hier zijn de wijzigingen die ik heb aangebracht, om een beter resultaat te krijgen bij Oracle's months_between()
functie :
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;
}
Met deze functie is het resultaat van de aanroep voor de data 17/02/2013 en 11/03/2016:36.806451612903224
Opmerking:voor zover ik het begrijp, is months_between()
. van Oracle functie gaat ervan uit dat alle maanden 31 dagen lang zijn