【问题标题】:Add Interval month or day添加间隔月或日
【发布时间】:2015-08-13 22:31:24
【问题描述】:

我需要能够基于单个静态值和第二个解码值添加两个日期。

我会使用 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"

有没有办法解决这个问题?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    无论如何,几个月和几年的时间间隔可能很棘手;如果您的程序日期是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2019-10-28
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多