我在下面的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;
Run Code Online (Sandbox Code Playgroud)
Bon*_*ist 22
您得到的错误要么是因为您TO_DATE正在使用已经是日期的列,并且您正在使用与nls_date_format参数[1] 不同的格式掩码,要么因为event_occurrence列包含的数据不是数字.
您需要a)更正您的查询,以便它不在日期列上使用TO_DATE,并且b)更正您的数据,如果event_occurrence应该只是数字.
并修复该列的数据类型以确保您只能存储数字.
[1] Oracle做什么时TO_DATE(date_column, non_default_format_mask)::
TO_DATE(TO_CHAR(date_column, nls_date_format), non_default_format_mask)
通常,默认nls_date_format参数设置为dd-MON-yy,因此在您的查询中,可能发生的事情是您的日期列被转换为格式为dd-MON-yy的字符串,然后您将其转换回日期使用格式MMDD.字符串不是这种格式,因此您会收到错误.