无论如何,几个月和几年的时间间隔可能很棘手;如果您的程序日期是 2015 年 8 月 31 日并且您添加了一个月,您会得到一个无效的日期(因为 9 月没有 31 天);同样,如果您有 2016-02-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