我需要在Oracle 11g r2中编写一个查询,如果日期范围在另一个日期范围内,它将检索记录。如果返回null值,那么我需要采用下一个间隔。
例如:
Input: March 01 2014 - March 31 2014
First Interval range: Jan 01 2014 - June 31 2014
Second Interval range: Feb 01 2015 - Mar 31 2015
Third Interval range: Sept 01 2015 - Dec 31 2015
记录在第一个时间间隔内,所以请返回。
第二个例子:
Input: Oct 01 2014 - Oct 31 2014
First Interval range: Jan 01 2014 - June 31 2014
Second Interval range: Feb 01 2015 - Mar 31 2015
Third Interval range: Sept 01 2015 - Dec 31 2015
记录不包含在任何范围内,因此我采用第二个时间间隔(输入后发生的下一个范围)。
答案 0 :(得分:0)
您可以将它们组合成如下所示的1个语句,但在存储过程中,性能方面可能更好,您可以检查 1)在指定的范围内查找结果。 2)只有在没有找到结果的情况下,才进行查询的第二部分以找到指定范围之后的下一个间隔。
WITH
inRange as
(
SELECT 1 as tmpID, Interval_Id
FROM your_table
WHERE :dateStart BETWEEN Interval_Start AND Interval_End
OR :dateEnd BETWEEN Interval_Start AND Interval_End
),
outRange as
(
SELECT 1 as tmpID, Interval_Id
FROM
(
SELECT Interval_Id
from your_table
where Interval_Start > :dateEnd
order by Interval_Start ASC
)
WHERE ROWNUM = 1
)
SELECT NVL(a.Interval_Id, b.Interval_Id) as Result
FROM inRange a
RIGHT JOIN outRange b on a.tmpID = b.tmpID
注意: