sql >> データベース >  >> RDS >> Oracle

JavaのORACLE関数MONTHS_BETWEENのアナログ

    私は同じニーズに遭遇し、@ alain.janinmの回答から始めました。これは良いことですが、場合によってはまったく同じ結果が得られないこともあります。
    ex:

    2013年2月17日から2016年3月11日までの月を検討してください("dd/MM/yyyy"
    Oracleの結果:36,8064516129032
    @ Alain.janinmのJavaメソッド回答:36.74193548387097

    Oracleのmonths_between()に近い結果を得るために、私が行った変更は次のとおりです。 機能:

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

    この関数を使用すると、2013年2月17日と2016年3月11日の日付の呼び出しの結果は次のようになります:36.806451612903224

    注:私の理解では、Oracleのmonths_between() 関数は、すべての月が31日であると見なします



    1. System.Data.OracleClientには、Oracleクライアントソフトウェアバージョン8.1.7以降が必要です。

    2. bashから.sqlスクリプトを実行する方法

    3. 不明な長さの配列を格納する

    4. InterfaceError:Oracle環境ハンドルを取得できません。 ORACLE_HOMEは正しく、SQL*Plusが接続します