sql >> Database >  >> RDS >> Oracle

Analoog van de ORACLE-functie MONTHS_BETWEEN in Java

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



  1. PHP isset() met meerdere parameters

  2. MySQL dynamische kruistabelquery:onderliggende records selecteren als extra kolommen

  3. Fout:MySQL wordt onverwacht afgesloten. Tijdens het proberen Mysql te starten op Xampp

  4. MySQL-buitenlandse sleutel bij verwijderen