【问题标题】:Crystal Reports - Oracle 01861 Error水晶报表 - Oracle 01861 错误
【发布时间】:2015-02-23 22:48:21
【问题描述】:

我有一个水晶报表,它将日期传递给 SQL 查询 {?Date}

这在使用 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}))

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

它还将通过将完成时间和开始时间彼此分开来计算故障时间。

最后,它将计算出当月的小时数 - 为我们提供可用小时数的停机时间。

【问题讨论】:

  • 很难解决这个丑陋的代码。它是否给出错误的行号?您可以上传一些示例数据吗?如果我们必须将日期转换 3 次以获得 1 个值,我们需要看看它是从什么开始的。
  • 没有行号。我知道代码很难看,我正在使用的架构很糟糕。我现在要编辑。
  • 这是更大视图或查询的一部分吗?分解其中的一些部分并清楚地运行它们。例如执行这个:select to_char(REAL_F_DATE,'DD-MM-YYYY HH24:MI:SS') from HISTORICAL_SEPARATE; 重复这个直到你运行整个部分。
  • 它不是更大的一部分。有趣的是,它可以在 Oracle SQL Dev 中运行,但在 Crystal 中运行时却不行。
  • Crystal 中设置的日期格式是什么?

标签: sql oracle plsql crystal-reports


【解决方案1】:

您对待{?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,这会导致隐式转换失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多