2015-08-13 83 views
0

我需要能夠根據單個靜態值和第二個解碼值添加兩個日期。添加時間間隔月或日

我會使用add_months,但它在2周的時間內表現不佳。

to_date(procedure_date, 'DD-MON-YYYY') + DECODE(visit_name,'0WK',interval '0' day,'2WK',interval '14' day,'1MO',interval '1' month, '1YR', interval '1' year) as due_date 

上述代碼的問題是,它不會讓我使用多個區間類型。如果我堅持幾天的工作,但一旦我在月份或年份添加它就會中斷。考慮到月份的可變長度,如果我試圖說'30天一個月,最終計算的日期在一段時間內將是錯誤的。

ORA-00932: inconsistent datatypes: expected NUMBER got INTERVAL YEAR TO MONTH 
00932. 00000 - "inconsistent datatypes: expected %s got %s" 

有沒有辦法解決這個問題?

回答

2

無論如何,月份和年份的間隔可能會非常棘手;如果你的程序日期是2015-08-31,並且你添加了一個月,你會得到一個無效日期(因爲9月份沒有31天);同樣如果你有2016年2月29日,並增加了一年,你會有同樣的問題。

將兩天的時間加入而不是使用間隔可能會更簡單;並使用add_months的幾個月和幾年,一個簡單的例子表達式中,而不是解碼(雖然這將工作太):

case visit_name 
    when '0WK' then to_date(procedure_date, 'DD-MON-YYYY') 
    when '2WK' then to_date(procedure_date, 'DD-MON-YYYY') + 14 
    when '1MO' then add_months(to_date(procedure_date, 'DD-MON-YYYY'), 1) 
    when '1YR' then add_months(to_date(procedure_date, 'DD-MON-YYYY'), 12) 
end as due_date 

它重複to_date()部分 - 但你應該有存儲爲正確的數據類型日期而不是作爲字符串反正,所以這只是你付出的代價的一部分......

隨着一些虛擬的數據:

with t (procedure_date, visit_name) as (
    select '03-Apr-2015', '2WK' from dual 
    union all select '10-Jul-2015', '0WK' from dual 
    union all select '15-Aug-2015', '1MO' from dual 
    union all select '27-Jan-2015', '1YR' from dual 
) 
select procedure_date, visit_name, 
    case visit_name 
    when '0WK' then to_date(procedure_date, 'DD-MON-YYYY') 
    when '2WK' then to_date(procedure_date, 'DD-MON-YYYY') + 14 
    when '1MO' then add_months(to_date(procedure_date, 'DD-MON-YYYY'), 1) 
    when '1YR' then add_months(to_date(procedure_date, 'DD-MON-YYYY'), 12) 
    end as due_date 
from t; 

PROCEDURE_D VIS DUE_DATE 
----------- --- ---------- 
03-Apr-2015 2WK 2015-04-17 
10-Jul-2015 0WK 2015-07-10 
15-Aug-2015 1MO 2015-09-15 
27-Jan-2015 1YR 2016-01-27