【问题标题】:SSRS 2005 passing datetime parameter to OracleSSRS 2005 将日期时间参数传递给 Oracle
【发布时间】:2014-02-28 16:56:43
【问题描述】:

我有一个 SSRS 2005 报告在 Oracle 9 数据库上运行。

报表使用这个简单的查询返回一个数据集

    SELECT order_number FROM apps.oe_order_headers_all  
    WHERE ordered_date >= to_date(:start_date,'DD-MON-YYYY') 
    AND ordered_date  < to_date(:end_date,'DD-MON-YYYY') +1

如果参数是 SSRS 中的字符串类型,则参数可以正常工作。例如。 start_date 和 end_date 均为 2014 年 1 月 1 日。但如果更改为日期时间,则报告不返回任何内容(如果为字符串,则报告返回许多行)。我真的很想使用SSRS的日期选择器控件。

这可能更像是 SSRS 的事情而不是 Oracle 的事情?

【问题讨论】:

    标签: oracle reporting-services


    【解决方案1】:

    这可能是一个日期转换问题,但我很惊讶它既没有出错,也没有返回相同的数据 - 至少对于您提供的示例日期而言。

    在您之前的问题中,您输入了一个字符串,因此添加 to_date() 是有意义的。但是,如果您将其绑定为 日期,那么您就不需要这些。

    这很好:

    to_date(<string>,'DD-MON-YYYY')
    

    但是这个:

    to_date(<date>,'DD-MON-YYYY')
    

    真的在做:

    to_date(to_char(<date>,<NLS_DATE_FORMAT>), 'DD-MON-YYYY')
    

    如果您的 `NLS_DATE_FORMAT 恰好与您提供的固定格式相同,那么这没关系,因为它只是到字符串的冗余转换并返回。但如果它们不同,那么您将得到错误或不正确的结果。

    例如,如果我的NLS_DATE_FORMATMM/DD/YYYY' thento_date(sysdate, 'DD-MON-YYYY) gets anORA-01843: not a valid montherror, because it's trying to interpret28as the month and02` 作为日期。

    所以你只需要将它简化为:

    SELECT order_number FROM apps.oe_order_headers_all  
    WHERE ordered_date >= :start_date
    AND ordered_date  < :end_date +1
    

    鉴于您从中得到的奇怪错误,您也可以尝试:

    AND ordered_date < :end_date + interval '1' day
    

    ...但不明白为什么更简单的+1 会出错,我不相信这会有所帮助。它似乎没有遵循正常的datetime arithmetic rules。这是另一种可能性,但不是必须的:

    AND ordered_date < CAST(:end_date AS DATE) + 1
    

    【讨论】:

    • 嗨,我收到了这个 ORA-00932:不一致的数据类型:预期的 DATE 得到了 NUMBER。但是如果我删除了 '+ 1' 它就可以了。现在可能是 pl sql 的事情?
    • @thotwielder - 这是一个奇怪的错误,如果绑定实际上是一个日期应该没问题。不确定这对于 SSRS 传递日期的方式、OCI 事物(使用内部原始格式)或......什么是不寻常的。不幸的是,我不能尝试这样做。
    • @AlexPoole 首先计算 算术表达式 .. 当看到 + 1 时,另一个操作数太期望为 NUMBER(因为优先级高于 NUMBER 而不是 as一个日期.. to_date() 应该已经解决了).. 在关系检查中使用 DATE 数据类型.. 它被隐式转换为 DATE!!只是我的猜测..
    • @OracleUser - 如果是这样,select * from dual where sysdate &lt; sysdate + 1 不会也失败吗?该错误表明它正在将:end_date +1 评估为一个数字;就像select * from dual where sysdate &lt; 3 一样,它也会抛出 ORA-00932。但这也没有任何意义。
    • @AlexPoole AND ordered_date
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    相关资源
    最近更新 更多