Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Analógico da função ORACLE MONTHS_BETWEEN em Java


Eu me deparei com a mesma necessidade e comecei com a resposta @alain.janinm, que é boa, mas não dá exatamente o mesmo resultado em alguns casos.
ex:

Considere os meses entre 17/02/2013 e 11/03/2016 ("dd/MM/yyyy" )
Resultado do Oracle:36,8064516129032
Método Java de @Alain.janinm resposta:36.74193548387097

Aqui estão as alterações que fiz, para obter um resultado mais próximo do months_between() do Oracle função:

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

Com esta função o resultado da chamada para as datas 17/02/2013 e 11/03/2016 é:36.806451612903224

Nota:Do meu entendimento, months_between() da Oracle função considera que todos os meses têm 31 dias