zoukankan      html  css  js  c++  java
  • Oracle判断两个时间段是否相交

    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)

  • 相关阅读:
    六. 异常处理5.多重catch语句的使用
    六. 异常处理4.try和catch的使用
    六. 异常处理3.未被捕获的异常
    六. 异常处理2.异常类型
    对mysql数据库中字段为空的处理
    mysql 中实现多条数据同时更新
    java 用PDFBox 删除 PDF文件中的某一页
    java7 java MethodHandle解析
    【十四】jvm 性能调优实例
    【十三】jvm 性能调优工具之 jstack
  • 原文地址:https://www.cnblogs.com/henuyuxiang/p/6904376.html
Copyright © 2011-2022 走看看