ORA-00907 Crystal 中缺少右括号 - 适用于 Oracle Developer

ORA-00907 missing right parenthesis In Crystal - Works in Oracle Developer

我有一个查询问题,它在 Oracle Developer 中工作正常,{?Month} 替换为 '2015-01-01' 但在 Crystal 中它给我错误 ORA-00907 missing right parenthesis使用下面的查询时。

参数

Parameter Name: Month

Prompting text: Enter Month

Value Type: String (also tried date)

Default Value: 2015-01-01 00:00:00AM

代码

SELECT /*+ ordered_predicates */
ACTIVE_SEPARATE.WO_NO, ACTIVE_SEPARATE.MCH_CODE,
(SELECT DISTINCT CASE WHEN MCH_CODE LIKE '%-%' THEN TRIM(SUBSTR(MCH_CODE, 0, INSTR(MCH_CODE, '-')-1)) ELSE MCH_CODE END FROM ACTIVE_SEPARATE ACTIVE_SEPARATE_SUB WHERE ACTIVE_SEPARATE.MCH_CODE = ACTIVE_SEPARATE_SUB.MCH_CODE) AS MCH_CODE_TRIM,
(SELECT DISTINCT CASE WHEN MCH_NAME LIKE '%-%' THEN TRIM(SUBSTR(MCH_NAME, 0, INSTR(MCH_NAME, '-')-1)) ELSE MCH_NAME END FROM EQUIPMENT_FUNCTIONAL WHERE ACTIVE_SEPARATE.MCH_CODE = EQUIPMENT_FUNCTIONAL.MCH_CODE) AS MCH_NAME_TRIM,
MCH_TYPE, ACTIVE_SEPARATE.REQUIRED_START_DATE, ACTIVE_SEPARATE.ERR_DESCR,
(24 * ((REAL_F_DATE) - (REQUIRED_START_DATE))) as BREAKDOWN_HOURS,
(100 - ((((last_day(to_date({?Month}, 'yyyy-mm-dd'))) -  trunc(to_date({?Month}, 'yyyy-mm-dd'), 'month'))*24) + 24) - (( (REAL_F_DATE) - (REQUIRED_START_DATE))* 24)) / ((24 * ((last_day(to_date({?Month}, 'yyyy-mm-dd'))) - trunc(to_date({?Month}, 'yyyy-mm-dd'), 'month'))) + 24) AS PERCENTAGE_AVAILABILITY
FROM ACTIVE_SEPARATE
RIGHT JOIN EQUIPMENT_FUNCTIONAL ON EQUIPMENT_FUNCTIONAL.MCH_CODE = (SELECT DISTINCT CASE WHEN MCH_CODE LIKE '%-%' THEN TRIM(SUBSTR(MCH_CODE, 0, INSTR(MCH_CODE, '-')-1)) ELSE MCH_CODE END FROM ACTIVE_SEPARATE ACTIVE_SEPARATE_SUB WHERE ACTIVE_SEPARATE.MCH_CODE = ACTIVE_SEPARATE_SUB.MCH_CODE)
WHERE ERR_CLASS = '001'
AND MCH_TYPE IS NOT NULL
AND ACTIVE_SEPARATE.REQUIRED_START_DATE BETWEEN
(trunc(to_date({?Month}, 'yyyy-mm-dd'),'month')
AND
last_day({?Month}))

UNION

SELECT /*+ ordered_predicates */
HISTORICAL_SEPARATE.WO_NO, HISTORICAL_SEPARATE.MCH_CODE,
case when (TRIM(SUBSTR(HISTORICAL_SEPARATE.MCH_CODE, 0, INSTR(HISTORICAL_SEPARATE.MCH_CODE, '-')-1))) is null then HISTORICAL_SEPARATE.MCH_CODE else(TRIM(SUBSTR(HISTORICAL_SEPARATE.MCH_CODE, 0, INSTR(HISTORICAL_SEPARATE.MCH_CODE, '-')-1))) end as MCH_CODE_TRIM,
case when (TRIM(SUBSTR(EQUIPMENT_FUNCTIONAL.MCH_NAME, 0, INSTR(EQUIPMENT_FUNCTIONAL.MCH_NAME, '-')-1))) is null then EQUIPMENT_FUNCTIONAL.MCH_NAME else(TRIM(SUBSTR(EQUIPMENT_FUNCTIONAL.MCH_NAME, 0, INSTR(EQUIPMENT_FUNCTIONAL.MCH_NAME, '-')-1))) end as MCH_NANME_TRIM,
MCH_TYPE,  HISTORICAL_SEPARATE.REQUIRED_START_DATE, HISTORICAL_SEPARATE.ERR_DESCR,
(24 * ((REAL_F_DATE) - (REQUIRED_START_DATE))) as BREAKDOWN_HOURS,
(100 - ((((last_day(to_date({?Month}, 'yyyy-mm-dd'))) -  trunc(to_date({?Month}, 'yyyy-mm-dd'), 'month'))*24) + 24) - (( (REAL_F_DATE) - (REQUIRED_START_DATE))* 24)) / ((24 * ((last_day(to_date({?Month}, 'yyyy-mm-dd'))) - trunc(to_date({?Month}, 'yyyy-mm-dd'), 'month'))) + 24) AS PERCENTAGE_AVAILABILITY
FROM HISTORICAL_SEPARATE
RIGHT JOIN EQUIPMENT_FUNCTIONAL ON EQUIPMENT_FUNCTIONAL.MCH_CODE = (SELECT DISTINCT CASE WHEN MCH_CODE LIKE '%-%' THEN TRIM(SUBSTR(MCH_CODE, 0, INSTR(MCH_CODE, '-')-1)) ELSE MCH_CODE END FROM HISTORICAL_SEPARATE HISTORICAL_SEPARATE_SUB WHERE HISTORICAL_SEPARATE.MCH_CODE = HISTORICAL_SEPARATE_SUB.MCH_CODE)
WHERE ERR_CLASS = '001'
AND MCH_TYPE IS NOT NULL
AND HISTORICAL_SEPARATE.REQUIRED_START_DATE BETWEEN
(trunc(to_date({?Month}, 'yyyy-mm-dd'),'month')
AND
last_day({?Month}))

你的前提是错误的;它在 SQL 开发人员中不起作用。如果您复制并粘贴您的查询并将 {?Month} 替换为 '2015-01-01',您会得到相同的 ORA-00907 错误,该错误在第 14 行第 1 列中报告,即 AND 本身.

这个:

BETWEEN
(trunc(to_date({?Month}, 'yyyy-mm-dd'),'month')
AND
last_day({?Month}))

的括号位置错误 - 您正在尝试执行 between (x and y) 这不是正确的语法。应该是:

BETWEEN
trunc(to_date({?Month}, 'yyyy-mm-dd'),'month')
AND
last_day({?Month})

在联盟的两半。

(另外,可能相关的问题:Crystal Reports - Oracle 01861 Errorthis 问题中的代码仍然不一致地处理参数 - 有时作为日期,有时作为字符串 -所以它依赖于 NLS 设置才能按预期工作。)