仅在案例语句中添加年份得到无效数字错误 - ORA-01722

Posted

技术标签:

【中文标题】仅在案例语句中添加年份得到无效数字错误 - ORA-01722【英文标题】:adding years getting invalid number error in case statement only - ORA-01722 【发布时间】:2018-12-10 16:25:29 【问题描述】:

请原谅我,因为我是新手。我正在尝试在查询中为日期添加一年。要添加的年份基于数据库中的月/日。如果日期在 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 语句中运行,没有错误。有任何想法吗?提前非常感谢。

【问题讨论】:

请编辑问题并显示表格定义和示例表格数据。谢谢。 如果日期早于 2017 年 11 月会怎样?我的意思是,应该显示什么? 应该少加 1 年。所以基本上我是在一个日期上加上几年。如果日期在 11 月 1 日之后,则将其视为尝试获得 x 周年纪念日,如果在 11 月 1 日之前获得 x-1 周年纪念日 【参考方案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。如何?请参阅我的工作示例。

【讨论】:

非常感谢您的示例和解释。这有效!【参考方案2】:

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

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() 可以提取您需要的位,而无需尝试通过日期反弹。

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

【讨论】:

非常感谢您的解释!这真的很有帮助!

以上是关于仅在案例语句中添加年份得到无效数字错误 - ORA-01722的主要内容,如果未能解决你的问题,请参考以下文章

Oracle报错ORA-01722: 无效数字排查解决方案

ORACLE-023:令人烦恼的 ora-01722 无效数字

ORA-01722: 无效的数字 where 子句

什么是“oracle ORA-01722”无效数字?

oracle创建实例时出现ORA- 00922缺失或无效,忽略后出现ORA-28000账号已被锁定。

ORA-01843: 执行插入语句时月份无效