Oracle
 sql >> Base de données >  >> RDS >> Oracle

Analogue de la fonction ORACLE MONTHS_BETWEEN en Java

J'ai rencontré le même besoin et je suis parti de la réponse @ alain.janinm qui est bonne mais ne donne pas exactement le même résultat dans certains cas.
ex :

Prenons les mois entre le 17/02/2013 et le 11/03/2016 ("dd/MM/yyyy" )
Résultat Oracle :36,8064516129032
Méthode Java de @Alain.janinm réponse :36.74193548387097

Voici les modifications que j'ai apportées, pour obtenir un résultat plus proche du months_between() d'Oracle fonction :

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;
} 

Avec cette fonction le résultat de l'appel pour les dates 17/02/2013 et 11/03/2016 est :36.806451612903224

Remarque :D'après ma compréhension du months_between() d'Oracle la fonction considère que tous les mois durent 31 jours