2009-09-24 20 views
2

我最近發現Oracle與給定日期(使用ADD_MONTHS函數)之間存在幾個月的差異,以及Java將日期添加到Calendar對象的方式。oracle add_months函數不同於Java

例如在Oracle:

select add_months('2009-02-28', +1) from dual; 

產生的結果是: 「31年9月3日」

和查詢:

select add_months('2009-02-28', -1) from dual; 

產生的結果爲「09-01- 31「

但是在Java中,相同計算的結果(使用GregorianCalendar.add()方法)是(分別): 09-03-28 和 09-01-28

有什麼方法可以使Oracle和Java的行爲相同嗎? (例如在oracle中的某些設置或Java中的某個參數)?

+0

當Oracle接管Sun時,問題會奇蹟般地修復它自己...... NOT :-) – 2009-09-25 05:56:06

回答

2

從上add_monthshttp://download-west.oracle.com/docs/cd/B19306_01/server.102/b14200/functions004.htm

甲骨文參考。如果日期是本月的最後一天,或者如果導致月有天數較少比日期的日分量,那麼結果是最後一天結果月份。否則,結果與日期相同。

這意味着你將不得不爲Java編寫一個方法來執行相同的檢查以獲得相同的結果(或PL/SQL中的行爲與Java相同的函數)。

5

當您進行月份算術時,您需要從業務角度決定以不同的天數處理月份的正確方法。您提出的問題的另一面是從更長的月份(如8月)到更短的月份(如果涉及閏年)從2月到2月,會發生什麼情況。 如果因爲計算找不到'Feb-30'而錯誤報告很快樂,那麼看看INTERVAL

0

您可以在java中編寫自己的添加月份函數。

public Date functionAddMonth(Date d, int month) 
{ 
    Calendar c = Calendar.getInstance(); 
    c.setTime(d); 
    c.add(Calendar.DAY, 1); 
    c.add(Calendar.MONTH, month); 
    c.add(Calendar.DAY, -1); 
    return c.getTime(); 
}