0

原谅我,因为我是新手。我正在尝试在查询中为日期添加一年。要添加的年份基于数据库中的月/日。如果日期在 11 月 1 日之前,那么年份将是 2017 年,如果在 11 月 1 日之后,那么它将是 2018 年。我已经尝试了几种方法(见下文)并且可以在查询中添加年份但是当我输入他们在案例陈述中我得到“无效号码”错误。

在日期使用 to_char:

   CASE
      WHEN to_char(au.creat_ts, 'MMDD') >= to_char('11/01/2018', 'MMDD') THEN
       to_char(to_date( '2017'||to_char(au.creat_ts,'MMDDHH24MISS'),
'YYYYMMDDHH24MISS' ), 'MM/DD/YYYY') 
      ELSE
      to_char(to_date( '2018'||to_char(au.creat_ts,'MMDDHH24MISS'), 'YYYYMMDDHH24MISS' ), 'MM/DD/YYYY') 
    END cmpltn_dt,

添加月份:

  CASE
      WHEN to_char(au.creat_ts, 'MMDD') >= to_char('11/01/2018', 'MMDD') THEN
       trunc(add_months(au.creat_ts,
                        floor(months_between(SYSDATE, au.creat_ts) / 12) * 12)) --calcx --add years
      ELSE
       trunc(add_months(au.creat_ts,
                        (floor(months_between(SYSDATE, au.creat_ts) / 12) - 1) * 12))
    END calcx,

这些在 select from dual 语句中运行,没有错误。有任何想法吗?提前非常感谢。

4

2 回答 2

1

如果AU.CREAT_TSDATE,这可以正常工作(意思是:它不会失败):

SQL> with au (creat_ts) as
  2    (select date '2018-12-05' from dual
  3    )
  4  select
  5    CASE WHEN to_char(au.creat_ts, 'MMDD') >= to_char(to_date('11/01/2018', 'dd/mm/yyyy'), 'MMDD') THEN
  6              trunc(add_months(au.creat_ts, floor(months_between(SYSDATE, au.creat_ts) / 12) * 12))
  7         ELSE trunc(add_months(au.creat_ts, (floor(months_between(SYSDATE, au.creat_ts) / 12) - 1) * 12))
  8    END calcx
  9  from au
 10  ;

CALCX
-------------------
05.12.2018 00:00:00

SQL>

注意区别:你使用

  CASE WHEN to_char(au.creat_ts, 'MMDD') >= to_char('11/01/2018', 'MMDD') THEN 

它会引发错误,因为它'11/01/2018'是一个字符串;这不是约会。如果你想使用日期,你必须告诉 Oracle。如何?请参阅我的工作示例。

于 2018-12-10T16:50:40.167 回答
0

错误来自该子句的两次出现:

to_char('11/01/2018', 'MMDD')

您将字符串作为第一个参数(不是日期)传递,Oracle 默认尝试将该字符串转换为数字 - 这会引发您看到的错误。

您要么需要通过显式转换字符串来传递实际日期:

to_char(to_date('11/01/2018', 'MM/DD/YYYY', 'MMDD')

或使用 ANSI 文字:

to_char(date '2018-11-01', 'MMDD')

或者如果它确实是一个固定值,则根本不转换它,只需执行以下操作:

'1101'

或者,如果您是从其他地方传递过来的 - 当然,您确定格式 - 我们substr()会提取您需要的位,而不会尝试通过日期反弹它。

顺便说一句,将值与日期相互转换并将字符串位连接在一起看起来有点混乱且容易出错。如果该固定日期始终是一个月的第一天,您可以修改您的案例表达式以仅查看月份,例如 via extract()

于 2018-12-10T16:50:22.240 回答