Sql ORA-00907在Crystal中缺少右括号-在Oracle Developer中工作

Sql ORA-00907在Crystal中缺少右括号-在Oracle Developer中工作,sql,oracle,oracle11g,crystal-reports,oracle-sqldeveloper,Sql,Oracle,Oracle11g,Crystal Reports,Oracle Sqldeveloper,我对一个查询有一个问题,它在Oracle Developer中运行良好,用{Month}替换为'2015-01-01',但在Crystal中,当使用下面的查询时,它给了我错误ORA-00907缺少右括号 参数 参数名称:月份 提示文本:输入月份 值类型:字符串(也包括日期) 默认值:2015-01-01 00:00:00AM 代码 SELECT /*+ ordered_predicates */ ACTIVE_SEPARATE.WO_NO, ACTIVE_SEPARATE.MCH_CODE, (

我对一个查询有一个问题,它在Oracle Developer中运行良好,用
{Month}
替换为
'2015-01-01'
,但在Crystal中,当使用下面的查询时,它给了我错误
ORA-00907缺少右括号

参数

参数名称:月份

提示文本:输入月份

值类型:字符串(也包括日期)

默认值: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 Developer中不起作用。如果复制并粘贴查询,并将
{?Month}
替换为
'2015-01-01'
,则会得到第14行第1列报告的相同ORA-00907错误,即

这:

括号位置错误-您试图在(x和y)之间执行
,这不是正确的语法。应该是:

BETWEEN
trunc(to_date({?Month}, 'yyyy-mm-dd'),'month')
AND
last_day({?Month})
在联盟的两半


(还有,可能是相关问题:。此问题中的代码仍然不一致地处理参数-有时作为日期,有时作为字符串-因此它依赖于NLS设置以按预期工作。)

是否尝试用实际日期文字替换月份参数,并查看结果?在哪里尝试查询?关于数据库还是使用crystal reports?@OldProgrammer Yeh如果我使用'2015-01-01'而不是crystal中的month,它会工作。@Siva正如我上面所说,它在oracle developer中工作,但在crystal中不工作。这看起来很有希望,在dev中的NLS设置已经更改了一些,也许这就是为什么它在dev中为我工作的原因。明天我将尝试该代码,并让您知道您确实不应该依赖NLS设置。尽可能使用实际日期,否则使用显式转换(指定格式模型)。你在某些地方这样做,所以你只需要坚持到底并保持一致。
BETWEEN
trunc(to_date({?Month}, 'yyyy-mm-dd'),'month')
AND
last_day({?Month})