假设为[s1,e1]和[s2,e2],并假设下列事实存在:
1、s1<s2
2、s1>e1
3、s2>e2
此时,如果s2落在s1,e1区间内,为重合。既s2<e1。
这样的话需要给出s2、e1为null时的逻辑,否则无法进行判断。
比如声明s2为null时为sysdate等。

解决方案 »

  1.   

    2、s1<e1
    3、s2<e2
    这里应该是这样,上面错了。不过影响不大
      

  2.   

    [2002-10-22,2003-1-12]和[2002-11-11,2003-3-3]:SQL> SELECT DECODE(SIGN(
      2  (TO_DATE('2003-01-12','YYYY-MM-DD')-TO_DATE('2002-11-11','YYYY-MM-DD'))*(TO_DATE('2003-01-12','
    YYYY-MM-DD')-TO_DATE('2003-03-03','YYYY-MM-DD'))),1,'FALSE','TRUE') FROM DUAL;DECO
    ----
    TRUE[2002-10-22,2002-11-10]和[2002-11-11,2003-3-3]:SQL> SELECT DECODE(SIGN(
      2  (TO_DATE('2002-11-10','YYYY-MM-DD')-TO_DATE('2002-11-11','YYYY-MM-DD'))*(TO_DATE('2002-11-10','
    YYYY-MM-DD')-TO_DATE('2003-03-03','YYYY-MM-DD'))),1,'FALSE','TRUE') FROM DUAL;DECOD
    -----
    FALSE
      

  3.   

    [DATE1,DATE2],[DATE3,DATE4]
    假设有时间交叉,则DATE2或DATE4肯定满足 DATE3<=DATE2<=DATE4 或
    DATE1<=DATE4<=DATE2 
    我上面写得只包含第一种情况,即DATE3<=DATE2<=DATE4
      

  4.   

    测试1:[2002-10-22,2003-1-12]和[2002-11-11,2003-03-03]:SQL> SELECT DECODE(SIGN(
      2  (TO_DATE('2003-01-12','YYYY-MM-DD')-TO_DATE('2002-11-11','YYYY-MM-DD'))*(TO_DATE('2003-01-12','  3  YYYY-MM-DD')-TO_DATE('2003-03-03','YYYY-MM-DD'))),1,
      4  DECODE(SIGN(
      5  (TO_DATE('2003-03-03','YYYY-MM-DD')-TO_DATE('2002-10-22','YYYY-MM-DD'))*(TO_DATE('2003-03-03','  6  YYYY-MM-DD')-TO_DATE('2003-01-12','YYYY-MM-DD'))),1,'FALSE','TRUE'),'TRUE') FROM DUAL;DECOD
    -----
    TRUE测试2:[2002-10-22,2002-11-10]和[2002-11-11,2003-3-3]:SQL> SELECT DECODE(SIGN(
      2  (TO_DATE('2002-11-10','YYYY-MM-DD')-TO_DATE('2002-11-11','YYYY-MM-DD'))*(TO_DATE('2002-11-10','  3  YYYY-MM-DD')-TO_DATE('2003-03-03','YYYY-MM-DD'))),1,
      4  DECODE(SIGN(
      5  (TO_DATE('2003-03-03','YYYY-MM-DD')-TO_DATE('2002-10-22','YYYY-MM-DD'))*(TO_DATE('2003-03-03','  6  YYYY-MM-DD')-TO_DATE('2002-11-10','YYYY-MM-DD'))),1,'FALSE','TRUE'),'TRUE') FROM DUAL;DECOD
    -----
    FALSE这样就可以了
      

  5.   

    能不能写一个[2002-10-22,2003-1-12] 和 [,2003-11-11]的SQL?
    没有下限的!!!!!
      

  6.   

    把下限值设成0001-01-01不就行了,难道还有公元前的数据?
    同样对没有上限的设成9999-12-12。SQL> SELECT DECODE(SIGN(
      2  (TO_DATE('2002-11-10','YYYY-MM-DD')-TO_DATE('0001-01-01','YYYY-MM-DD'))*(TO_DATE('2002-11-10','  3  YYYY-MM-DD')-TO_DATE('2003-03-03','YYYY-MM-DD'))),1,
      4  DECODE(SIGN(
      5  (TO_DATE('2003-03-03','YYYY-MM-DD')-TO_DATE('2002-10-22','YYYY-MM-DD'))*(TO_DATE('2003-03-03','  6  YYYY-MM-DD')-TO_DATE('2002-11-10','YYYY-MM-DD'))),1,'FALSE','TRUE'),'TRUE') FROM DUAL;DECOD
    -----
    TRUE