Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Analog zur ORACLE-Funktion MONTHS_BETWEEN in Java

Ich bin auf das gleiche Bedürfnis gestoßen und habe mit der Antwort von @alain.janinm begonnen, die gut ist, aber in einigen Fällen nicht genau das gleiche Ergebnis liefert.
Beispiel:

Betrachten Sie die Monate zwischen dem 17.02.2013 und dem 11.03.2016 ("dd/MM/yyyy"). )
Oracle-Ergebnis:36,8064516129032
Java-Methode von @Alain.janinm Antwort:36.74193548387097

Hier sind die Änderungen, die ich vorgenommen habe, um ein näheres Ergebnis an Oracles months_between() zu erhalten Funktion :

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

Mit dieser Funktion ist das Ergebnis des Aufrufs für die Daten 17.02.2013 und 11.03.2016:36.806451612903224

Hinweis:Nach meinem Verständnis Oracles months_between() Funktion berücksichtigt, dass alle Monate 31 Tage lang sind