Crystal Reports - Oracle 01861 Error



我有一个水晶报告,它将日期传递到SQL查询{?date}

当crystal使用ODBC连接时,这起到了作用,但当将其更改为"Oracle服务器"连接时,我收到了一个错误:

ORA-01861: literal does not match format string

我已经尝试删除to_char或to_date(根据研究,这似乎是问题的原因,但没有效果)

SELECT
ACTIVE_SEPARATE.WO_NO,
MCH_TYPE,
24 * (to_date(to_char(REAL_F_DATE,'DD-MM-YYYY HH24:MI:SS'), 'DD-MM-YYYY HH24:MI:SS') - to_date(to_char(REQUIRED_START_DATE,'DD-MM-YYYY HH24:MI:SS'), 'DD-MM-YYYY HH24:MI:SS')) as BREAKDOWN_HOURS,
(100 - (((24 * (to_date(to_char(last_day(to_date({?Month}, 'dd-mm-yyyy')),'DD-MM-YYYY'), 'DD-MM-YYYY') - to_date(to_char( trunc(to_date({?Month}, 'dd-mm-yyyy'), 'month'),'DD-MM-YYYY'), 'DD-MM-YYYY'))) + 24) - (24 * (to_date(to_char(REAL_F_DATE,'DD-MM-YYYY HH24:MI:SS'), 'DD-MM-YYYY HH24:MI:SS') - to_date(to_char(REQUIRED_START_DATE,'DD-MM-YYYY HH24:MI:SS'), 'DD-MM-YYYY HH24:MI:SS')))) / ((24 * (to_date(to_char(last_day(to_date({?Month}, 'dd-mm-yyyy')),'DD-MM-YYYY'), 'DD-MM-YYYY') - to_date(to_char( trunc(to_date({?Month}, 'dd-mm-yyyy'), 'month'),'DD-MM-YYYY'), 'DD-MM-YYYY'))) + 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({?Month}, 'MM')
AND
LAST_DAY({?Month}))

其实质是用户输入一个日期(任何日期)。此代码将采用日期。计算出所选月份的总小时数。

它还将通过将完成时间和开始时间分开来计算出分解时间。

最后,它将计算出一个月的工作时间——刹车时间,为我们提供可用的工作时间。

您对待{?Month}值的方式不一致。在您正在执行的选择列表中:

to_date({?Month}, 'dd-mm-yyyy')

如果Crytal短日期被视为字符串类型,那么这是可以的(尽管使用斜杠而不是破折号会更好),但如果它被视为日期类型,那么它就是隐式转换为字符串,然后显式转换回日期,这意味着你的NLS设置开始发挥作用。

但在你刚刚做的where子句中:

BETWEEN trunc({?Month}, 'MM') AND LAST_DAY({?Month}))

情况正好相反。如果Crytal短日期被视为字符串类型,那么这是对日期的隐式转换,这意味着你的NLS设置将再次发挥作用,但如果它被视为日期类型,那么也没关系。

他们不可能都是对的,而且我不熟悉Crystal Reports,所以我不确定发生了哪种转换。使它们一致——要么在where子句中添加显式转换,要么在选择列表中删除它——将显示出问题所在。我认为ORA-01861只能来自to_date(),这意味着where子句是问题所在。

在SQL Developer中,您的NLS_DATE_FORMAT可能是DD-MM-YYYY,因此无论以何种方式发生,隐式转换仍然"有效"。但在Crystal Reports中,您有一个不同的NLS_DATE_FORMAT,这会导致隐式转换失败。

最新更新