在 Oracle 查询的函数调用中进行日期时间数学运算

Posted

技术标签:

【中文标题】在 Oracle 查询的函数调用中进行日期时间数学运算【英文标题】:Doing datetime math in a function call in an Oracle query 【发布时间】:2012-05-29 21:03:32 【问题描述】:

好的,我已经回答了问题的第一部分,所以这是第二部分。 :-) 在 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:我应该澄清一下,这是一个 s-s-rS 2008 R2 项目,DateBeginDateEnd 在报告参数中定义为 DateTime 参数。我当前的解决方法包括将:DateEnd 查询参数设置为等于@DateEnd 报告参数+ 1,但我担心有一天我会忘记正确记录这一点,并让试图维护报告的人感到困惑(可能是我)。我不想按照之前的建议传递字符串参数。

【问题讨论】:

clinicalDate是什么数据类型,convert_date_to_id的参数和返回类型是什么? FUNCTION Convert_Date_to_ID (thedate IN Date) RETURN NUMERIC AS BEGIN RETURN (thedate-to_date('01/01/1960','mm/dd/yyyy'))*1000000*86400;结束; 【参考方案1】:

我认为参数是 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) 

【讨论】:

第二个不起作用——clinicalDate 是一个奇怪的带有时间戳的东西,包括与进行编辑的工作站相关的 ID。不过,我会检查您的第一个建议。谢谢! 是的,这很奏效,它把转换放在我想要的地方——检查的地方越多,我错过的机会就越大。 :-)【参考方案2】:

假设ml.convert_date_to_idDATE 作为输入参数,而不是表示日期的VARCHAR2,并假设:DateEnd 绑定变量是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 )

【讨论】:

我不认为它是一个 varchar,虽然我不确定绑定在这里是如何工作的——当我在 s-s-rS 中使用该查询时,数据集参数绑定到一个报表参数,即定义为日期。【参考方案3】:

使用to_date 转换值。例如:

select &date + 1 from dual

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

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

【讨论】:

以上是关于在 Oracle 查询的函数调用中进行日期时间数学运算的主要内容,如果未能解决你的问题,请参考以下文章

加密解密,MySQL单行函数,数学函数字符串日期时间,流程控制,完整详细可收藏查询SQL

SQL中按日期进行查询,如何截取日期进行查询

oracle 查询每组的最大值

0831 模糊查询,排序查询,聚合函数,时间日期函数,数学函数,字符串函数

ORA-00936 在 oracle 选择语句中使用日期函数时

oracle对应数据库时间字段的模糊查询以及普通字段的模糊查询