在 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 项目,DateBegin
和 DateEnd
在报告参数中定义为 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_id
将DATE
作为输入参数,而不是表示日期的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
0831 模糊查询,排序查询,聚合函数,时间日期函数,数学函数,字符串函数