sql >> Databasteknik >  >> RDS >> Oracle

Analog av ORACLE-funktionen MONTHS_BETWEEN i Java

Jag har stött på samma behov och utgått från @alain.janinm svar som är bra men inte ger exakt samma resultat i vissa fall.
ex:

Tänk på månader mellan 17/02/2013 och 11/03/2016 ("dd/MM/yyyy" )
Oracle-resultat :36,8064516129032
Java-metod från @Alain.janinm svar :36.74193548387097

Här är ändringarna jag gjorde för att få ett bättre resultat till Oracles months_between() 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;
} 

Med denna funktion blir resultatet av samtalet för datumen 17/02/2013 och 11/03/2016:36.806451612903224

Notera:Såvitt jag förstår Oracles months_between() funktion anser att alla månader är 31 dagar långa



  1. Laravel Query Builder - avancerade villkorssatser (valfria parametrar)

  2. PostgreSQL skapa tabell om den inte finns

  3. Använda pseudokolumner med en länkad server

  4. Vad är det för fel på min SQL Fiddle-fråga?