添加年份仅在 case 语句中出现无效数字错误 - ORA-01722
adding years getting invalid number error in case statement only - ORA-01722
请原谅我,因为我是新手。我正在尝试将年份添加到查询中的日期。要添加的年份以数据库中的 month/day 为准。如果日期早于 11 月 1 日,则年份为 2017 年,如果日期晚于 11 月 1 日,则年份为 2018 年。我已经尝试了几种方法(见下文)并且可以在查询中添加年份但是当我把他们在案例陈述中我得到 'Invalid Number' 错误。
使用 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,
这些 运行 in select 来自对偶语句,没有错误。有任何想法吗?非常感谢。
错误来自该子句的两次出现:
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()
可以提取您需要的位,而无需尝试通过日期反弹。
顺便说一句,将值与日期相互转换以及将字符串位连接在一起看起来有点混乱且容易出错。如果该固定日期始终是一个月的第一天,您可以修改您的 case 表达式以仅查看月份,例如通过 extract()
。
如果 AU.CREAT_TS
是 DATE
,这工作正常(意思是:它不会失败):
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。如何?请参阅我的工作示例。
请原谅我,因为我是新手。我正在尝试将年份添加到查询中的日期。要添加的年份以数据库中的 month/day 为准。如果日期早于 11 月 1 日,则年份为 2017 年,如果日期晚于 11 月 1 日,则年份为 2018 年。我已经尝试了几种方法(见下文)并且可以在查询中添加年份但是当我把他们在案例陈述中我得到 'Invalid Number' 错误。
使用 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,
这些 运行 in select 来自对偶语句,没有错误。有任何想法吗?非常感谢。
错误来自该子句的两次出现:
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()
可以提取您需要的位,而无需尝试通过日期反弹。
顺便说一句,将值与日期相互转换以及将字符串位连接在一起看起来有点混乱且容易出错。如果该固定日期始终是一个月的第一天,您可以修改您的 case 表达式以仅查看月份,例如通过 extract()
。
如果 AU.CREAT_TS
是 DATE
,这工作正常(意思是:它不会失败):
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。如何?请参阅我的工作示例。