Ho riscontrato la stessa esigenza e sono partito dalla risposta di @alain.janinm che è buona ma in alcuni casi non dà lo stesso identico risultato.
ex :
Considera i mesi tra il 17/02/2013 e il 03/11/2016 ("dd/MM/yyyy"
)
Risultato Oracle :36,8064516129032
Metodo Java da @Alain.janinm risposta:36.74193548387097
Ecco le modifiche che ho apportato, per ottenere un risultato più vicino a months_between()
di Oracle funzione :
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;
}
Con questa funzione il risultato del bando per le date 17/02/2013 e 11/03/2016 è:36.806451612903224
Nota:da quanto ho capito, months_between()
di Oracle la funzione considera che tutti i mesi durano 31 giorni