• 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)

  • 相关阅读:
    使用 libevent 和 libev 提高网络应用性能
    在PHP中PDO解决中文乱码问题的一些补充
    apache重写规则详解
    Apache的配置
    正则表达式30分钟入门教程
    LVS+keepalived搭建负载均衡
    php判断终端是手机还是电脑访问网站代码
    nginx 502 bad gateway
    算法复习-深度优先遍历和回溯法的关系
    分支限界法和回溯法对比
  • 原文地址:https://www.cnblogs.com/henuyuxiang/p/6904376.html
Copyright © 2020-2023  润新知