【问题标题】:Why is to_date needed to pull data from Oracle into Crystal Reports为什么需要 to_date 将数据从 Oracle 提取到 Crystal Reports
【发布时间】:2017-08-31 16:15:29
【问题描述】:

如果我从我的 Oracle DB 在 PL/SQL 中运行以下选择,我会返回预期结果:

select * from risk t where t.accounting_to_date='01-JAN-3000'

当我在 Crystal Reports 2016 中使用命令和 Oracle 连接运行相同的选择语句时,我无法提取任何数据。

我找到的解决方法是:

  1. 在我的 Crystal Report 命令中使用 to_date 函数,如下所示:

    select * from risk t where t.accounting_to_date= to_date('01-JAN-3000','dd-MON-yyyy')

  1. 使用 ODBC 连接。

这两种解决方法都有效。但是,我的问题是:是什么导致了这个问题?有没有可以更改的设置?是 Oracle 方面的问题还是 Crystal Reports 方面的问题?这是一个错误吗?

我只是想弄清楚为什么会发生这种情况。我必须使用 Oracle 连接,而不是 ODBC,因此我无法使用这种解决方法。在 Oracle 或 Crystal 中使用每个日期周围的 to_date 是压倒性的。我已经不得不将此功能添加到几十个日期,而且还有数百个。

当我们将连接 Crystal Reports 的方式从使用 ODBC 连接更改为 Oracle 连接时,我偶然发现了这一点。我发现了很多缺失的数据,并通过使用 to_date 函数进行了更正。

提前谢谢你。

【问题讨论】:

  • 如果accounting_to_date 是一个日期,那么将它与字符串01-JAN-3000 进行比较涉及到隐式数据转换。您应该始终对日期使用显式数据转换。
  • 您可以在 Oracle 中将日期文字指定为 date '3000-01-31' 或更详细的 to_date() 表达式(如果您真的需要)。 '01-JAN-3000' 只是一个字符串,您相信当前的默认设置会按照您希望的方式进行转换。如果有人从具有不同语言设置的桌面运行此程序怎么办?

标签: oracle plsql crystal-reports to-date


【解决方案1】:

varchar2 到日期的默认转换仅适用于“01-JAN-2017”,因为 oracle nls_date_format 配置为使用该默认格式。可以在每个会话中更改默认格式,这很可能是 Crystal Reports 每次建立连接时所做的。

如果你运行这个,你会看到默认是什么:

SELECT value
FROM   nls_session_parameters
WHERE  parameter = 'NLS_DATE_FORMAT'

如果您以某种方式将该查询添加到您的报告中,您可能能够看到水晶报告设置的格式。

您可能永远不应该依赖默认格式来始终工作。如果 DBA 愿意,他可以更改该格式,所有依赖它的代码都会中断。

【讨论】:

  • 解决这个问题的另一种方法是我们在 Oracle 中创建了一个物化视图。当我们在 Crystal 中创建报表并从物化视图中提取时,我们会看到所有数据。即使视图中的日期没有使用 to_date 函数。但是,如果我们直接从视图中拉出来,我们就会遇到问题。该字段是一个州代码(缅因州的 ME),为了获取该代码,我们在视图中调用一个函数。在该函数中,Where 子句中有一个日期。如果我们在该日期前后不使用 to_date 函数,则州代码字段为空白。谁能给我解释一下?
  • 您的观点是否包括 where 子句?
  • 自动转换为日期可能在编译后的代码中起作用,因为它将根据编译时的当前内容(例如物化视图)使用 nls_date_format 设置,而不是在运行时。底线 '01-JAN-2017' 不是日期,而是字符串。它有时用作约会的事实是巧合。您唯一可以依赖的就是使用 to_date()。
  • 视图调用一个函数,它在函数中,日期在 Where 子句中。我想我的想法是甲骨文会做所有的处理,然后水晶会只是提取值......但它似乎并没有那样工作。因为在 Oracle 中运行视图时不需要使用 to_date,只有在使用 Crystal Reports 时才需要。
【解决方案2】:

我们在 Crystal 中使用 Oracle ODBC 驱动程序时遇到了同样的问题,并且在我们移至“CR Oracle Wire Protocol ODBC 驱动程序”时得到了修复。由于您需要使用 oracle 连接,因此我不确定您会做什么。以下是我们从 SAP 中发现的:

Info from SAP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2014-07-08
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多