首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理Oracle日期范围

处理Oracle日期范围
EN

Stack Overflow用户
提问于 2014-08-05 02:27:55
回答 1查看 89关注 0票数 0

我需要在Oracle11g r2中编写一个查询,如果一个日期范围在另一个日期范围内,它将检索记录。如果返回空值,那么我需要取下一个时间间隔。

例如:

代码语言:javascript
运行
复制
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

该记录在第一个间隔内,因此返回该记录。

第二个例子:

代码语言:javascript
运行
复制
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

记录不包括在任何范围内,所以我采用第二个间隔(输入之后的下一个范围)。

EN

Stack Overflow用户

发布于 2016-01-08 16:54:28

您可以像下面这样将它们组合成一条语句,但在存储过程中性能可能会更好,您可以在存储过程中检查1)在指定范围内查找结果。2)仅当未找到结果时,才执行查询的第二部分,以查找指定范围之后的下一个间隔。

代码语言:javascript
运行
复制
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只是一个将两个结果粘合在一起的工件。正如我上面提到的,最好分成两个查询。
  • RIGHT JOIN -由于某种原因,也可以使用完全外部连接
  • 查询的第二部分不能内联工作,这就是我使用CTE的原因。
  • 假设您的时间间隔都不会与

重叠

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25125193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档