1

好的,我的问题的第一部分得到了回答,所以这是第二部分。:-) 在 PLSQL 查询中,我的条件如下所示:

where Doc3.clinicalDate >= ml.convert_date_to_id(:DateBegin)
    and Doc3.clinicalDate < ml.convert_date_to_id(:DateEnd)

现在,我不想使用 :DateEnd 本身——我想添加 1 天,这样当它将日期时间与午夜进行比较时,我会得到第二天的午夜。不幸的是,当我这样做时

where Doc3.clinicalDate >= ml.convert_date_to_id(:DateBegin)
    and Doc3.clinicalDate < ml.convert_date_to_id(:DateEnd + 1)

我得到“ORA-06553:PLS-306:调用‘CONVERT_DATE_TO_ID’时参数的数量或类型错误”。“:DateEnd + 间隔 '1' 天”给了我“ORA-30081:日期时间/间隔算术的无效数据类型”(其中 :DateEnd 绑定到 2012 年 5 月 31 日)。如果我执行“convert_date_to_id(add_months(:DateEnd, 1))”,它工作正常。有什么想法吗?谢谢。

ETA:我应该澄清这是一个 SSRS 2008 R2 项目,并且DateBeginDateEnd报告参数中定义为 DateTime 参数。我当前的解决方法是将:DateEnd查询参数设置为等于@DateEnd报告参数 + 1,但我担心有一天我会忘记正确记录这一点,并混淆试图维护报告的人(可能是我) . 如前所述,我不想传递字符串参数。

4

3 回答 3

2

假设ml.convert_date_to_id将 aDATE作为输入参数而不是VARCHAR2表示日期的 a ,并假设:DateEnd绑定变量是 a VARCHAR2,您将需要类似

ml.convert_date_to_id( to_date( :DateEnd, 'DD-MON-YYYY' ) + 1 )

或者

ml.convert_date_to_id( to_date( :DateEnd, 'DD-MON-YYYY' ) + interval '1' day )
于 2012-05-29T21:46:10.327 回答
2

我认为 DateTime 的参数是问题的根源。Microsoft DateTime 数据类型比 Oracle 的数据类型更精细,因为它支持小数秒,而 Oracle DATE 格式不支持(但 Oracle TIMESTAMP 支持)。

由于 ADD_MONTHS 只是吐回它在 DATE 数据类型中传递的任何内容(即传递的 TIMESTAMP 变为 DATE)。因此,也许您可​​以转换参数并以这种方式添加日期:

where Doc3.clinicalDate >= ml.convert_date_to_id(:DateBegin) 
    and Doc3.clinicalDate < ml.convert_date_to_id(CAST(:DateEnd as DATE)+1) 

或者,忘记参数的转换和日期算术,并从第二个临床日期中减去一天:

where Doc3.clinicalDate >= ml.convert_date_to_id(:DateBegin) 
    and Doc3.clinicalDate - 1 < ml.convert_date_to_id(:DateEnd) 
于 2012-06-28T18:44:28.377 回答
0

用于to_date转换值。例如:

select &date + 1 from dual

通知to_date('29052012','ddmmyyyy')工作正常

通知'29-may-2012'ORA-01722: invalid number

于 2012-05-29T21:16:19.327 回答