我需要在Oracle11g r2中编写一个查询,如果一个日期范围在另一个日期范围内,它将检索记录。如果返回空值,那么我需要取下一个时间间隔。
例如:
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记录不包括在任何范围内,所以我采用第二个间隔(输入之后的下一个范围)。
发布于 2016-01-08 16:54:28
您可以像下面这样将它们组合成一条语句,但在存储过程中性能可能会更好,您可以在存储过程中检查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备注:
重叠
https://stackoverflow.com/questions/25125193
复制相似问题