SQL中常常要判断两个时间段是否相交,该如何判断呢?比如两个时间段(S1,E1)和(S2,E2)。我最先想到的是下面的方法一。
方法一:(S1 BETWEEN S2 AND E2) OR (S2 BETWEEN S1 AND E1)。很好理解:一个时间段的开始时间S1在另一个时间中间(S2,E2),或者开始时间S2在另一个时间中间(S1,E1),这个方法比较繁琐

方法二本方法先考虑这两段时间什么情况下不相交,如图:

   -----+-----------------+-----------------+--------------+--------------

S1                    E1                  S2                 E2

-----+-----------------+-----------------+--------------+--------------

S2                    E2                  S1                 E1

无非两种情况:(S1,E1)段在(S2,E2)段前面和(S1,E1)段在(S2,E2)段后面。其对应的表达式为:(S2 > E1) OR (S1 >  E2)。

于是相交条件就是 NOT((S2 > E1) OR (S1 >  E2))该式等价于

                      (S2 <= E1)AND (S1 <= E2)

这就是我们要的。

例:select  *  from  tr_schedule_affair  where  not(('2017-05-23 10:00' > end_time) or (start_time >  '2017-05-23 12:30')) 

其实方法一和方法二的条件是一致的:
((S1 <=  E2) AND (S1 >= S2)) OR ((E1 <= E2) AND (E1 >= S2))
 =>((S1 <= E2) AND (S1 >= S2) ) OR ((S1 <= E2) AND (E1 >= S2))  (因为S1 <= E1)
<=> (S1 <= E2) AND ((S1 >= S2) OR (E1 >= S2))
 => (S1 <= E2) AND ((E1 >= S2) OR (E1 >= S2))  (因为 S1 <= E1)
<=>(S1 <= E2) AND (E1 >= S2)

Oracle判断两个时间段是否相交的更多相关文章

  1. mysql判断两个时间段是否有交集

    //判断两个时间段是否有交集 private function checkTimeCross($start_time,$end_time){ $sql ) AND ((start_time > ...

  2. ORACLE判断两个日期间隔几个工作日

      CreateTime--2017年9月7日17:14:56 Author:Marydon ORACLE判断两个日期间隔几个工作日 方法:使用存储过程 /** * 判断两个日期间隔几个工作日 */ ...

  3. sql语句判断两个时间段是否有交集

    场景:  数据库有有两个字段.开始时间<startTime>,和结束时间<endTime>,指定一个时间段(a,b),a表示开始时间,b表示结束时间.看数据库中有没有与(a,b ...

  4. js判断两个时间段是否有交集

    //判断两个时间是否有交集 function isDateIntersection(start1, end1, start2, end2) { var startdate1 = new Date(st ...

  5. java 判断两个时间段是不是有交集

    如上图:X Y  Z  分别为传来的开始时间可能位于数据库中时间段的位置. X有三种可能 即传来的开始时间为与数据可中某条数据的开始位置!      这样他的结束时间就有三种可能       1.位于 ...

  6. java 判断两个时间段是否有交集

    /* 开始时间 */ Date leftStartDate = feesPreferential.getPreferentialStartTime(); /* 结束时间 */ Date leftEnd ...

  7. C# 判断两条直线是否相交

    直接上代码,过程不复杂 /// <summary> /// 判断两条线是否相交 /// </summary> /// <param name="a"& ...

  8. Oracle 查询两个时间段内的所有日期列表

    1.查询某时间段内日期列表 select level,to_char(to_date('2013-12-31','yyyy-mm-dd')+level-1,'yyyy-mm-dd') as date_ ...

  9. PHP判断两个矩形是否相交

    <?php $s = is_rect_intersect(1,2,1,2,4,5,0,3); var_dump($s); /* 如果两个矩形相交,那么矩形A B的中心点和矩形的边长是有一定关系的 ...

随机推荐

  1. 五十三 网络编程 TCP/IP简介

    虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Microsoft都有各自的 ...

  2. cocos2d-x addImageAsync()异步加载资源成功之后的场景跳转问题

    http://blog.csdn.net/w20175357/article/details/23546985 1.先说说addImageAsync()异步加载图片的问题 做游戏的时候现在资源的比较大 ...

  3. WCF+Windows2008&&sqlserver2008

    这些在我的文件和云盘当中也可以在csdn中查找

  4. 633. Sum of Square Numbers【Easy】【双指针-是否存在两个数的平方和等于给定目标值】

    Given a non-negative integer c, your task is to decide whether there're two integers a and bsuch tha ...

  5. java汉字获取首字母

    前言 在项目中很多时候我们需要获取姓名或者名称的首字母或者全拼,以用于模糊查询或者字母查询,在这里分享一个实例:供小伙伴们参考. 导入jar包 <dependency> <group ...

  6. 51nod 1201 (dp)

    整数划分 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种.由于数据较大,输出Mod 10^9 + 7的结果即可.   In ...

  7. python itertools的使用(转)

    1. chain的使用 import itertools listone = ['a','b','c'] listtwo = ['11','22','abc'] for item in itertoo ...

  8. 理解Python的迭代器(转)

    原文地址: http://python.jobbole.com/81916/ 另外一篇文章: http://www.cnblogs.com/kaituorensheng/p/3826911.html ...

  9. 【状压dp】Islands and Bridges

    Islands and Bridges Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 11034   Accepted: 2 ...

  10. 【贪心】【后缀自动机】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem E. Enter the Word

    题意:给你一个串,让你从左到右构造这个串,一次操作可以直接在当前串后面添加一个任意字符,或者拷贝当前串的任意一个子串到当前串的后面.问你最少要多少次操作才能构造出这个串. 从前向后贪心,从当前已构造的 ...