我在下面的 sql 中收到错误:
ORA-01858: 在需要数字的地方发现了非数字字符
SELECT c.contract_num,
CASE
WHEN ( MAX (TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD'))
- MIN (TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD')))
/ COUNT (c.event_occurrence) < 32
THEN
'Monthly'
WHEN ( MAX (
TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD'))
- MIN (
TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD')))
/ COUNT (c.event_occurrence) >= 32
AND ( MAX (
TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD'))
- MIN (
TO_CHAR (TO_DATE (c.event_dt, 'YYYY-MM-DD'), 'MMDD')))
/ COUNT (c.event_occurrence) < 91
THEN
'Quarterley'
ELSE
'Yearly'
END
FROM ps_ca_bp_events c
GROUP BY c.contract_num;
您收到的错误要么是因为您正在做TO_DATE
在已经是日期的列上,并且您使用的格式掩码与您的不同nls_date_format
参数[1] 或因为 event_occurrence 列包含非数字数据。
您需要 a) 更正您的查询,以便它不在日期列上使用 TO_DATE,并且 b) 更正您的数据(如果 event_occurrence 应该只是数字)。
并修复该列的数据类型以确保只能存储数字。
[1] 当您执行以下操作时,Oracle 会做什么:TO_DATE(date_column, non_default_format_mask)
is:
TO_DATE(TO_CHAR(date_column, nls_date_format), non_default_format_mask)
一般情况下,默认nls_date_format
参数设置为dd-MON-yy
,因此在您的查询中,可能发生的情况是您的日期列被转换为格式为 dd-MON-yy 的字符串,然后您将其转换回使用格式 MMDD 的日期。该字符串不是这种格式,因此会出现错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)