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)

  • 相关阅读:
    springboot属性类自动加载配置文件中的值
    mysql修改root密码
    idea各种图标说明
    nginx安装配置
    notepad++下载32位,安装插件管理
    crontab 定时执行脚本出错,但手动执行脚本正常
    jenkins安装配置
    VirtualBox从USB设备(PE)启动图文教程
    如何卸载windows的服务?卸载服务?
    在Windows的CMD中如何设置支持UTF8编码?
  • 原文地址:https://www.cnblogs.com/henuyuxiang/p/6904376.html
Copyright © 2011-2022 走看看