Oracle
 sql >> Database >  >> RDS >> Oracle

Analogo della funzione ORACLE MONTHS_BETWEEN in Java

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