处理Oracle日期范围

时间:2014-08-04 18:27:55

标签: sql oracle date

我需要在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

记录不包含在任何范围内,因此我采用第二个时间间隔(输入后发生的下一个范围)。

1 个答案:

答案 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

注意:

  • tmpID只是将2个结果粘在一起的工件。就像我一样 如上所述,最好分成2个查询。
  • RIGHT JOIN - 也可以使用FULL OUTER JOIN
  • 由于某种原因,查询的第二部分不能内联工作,所以这就是我使用CTE的原因。
  • 假设没有任何间隔重叠