解决方案 »

  1.   

    WITH test AS(
    SELECT 1 ID,'2014-03-12' sd,'2013-03-22' ed FROM dual UNION ALL
    SELECT 2 ID,'2014-03-07' sd,NULL ed FROM dual UNION ALL
    SELECT 3 ID,'2014-03-09' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-05' sd,NULL ed FROM dual UNION ALL
    SELECT 5 ID,'2014-03-25' sd,'2014-03-30' ed FROM dual
    ), test1 AS(
    SELECT 1 ID,'2014-03-03' sd,'2013-03-04' ed FROM dual UNION ALL
    SELECT 2 ID,'2014-03-23' sd,NULL ed FROM dual UNION ALL
    SELECT 3 ID,'2014-03-09' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-05' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-03' sd,'2014-03-06' ed FROM dual UNION ALL
    SELECT 5 ID, '2014-03-25' SD, '2014-03-30' ED
      FROM DUAL)
    SELECT *
      FROM TEST1 T
     WHERE NOT (EXISTS (SELECT 1
                          FROM TEST S
                         WHERE S.SD = T.SD
                           AND S.ED IS NULL) AND t.ed IS NULL)
       AND NOT (EXISTS (SELECT 1
                          FROM TEST S
                         WHERE ((S.SD <= T.SD AND decode(S.ED,NULL,'9999-12-31',s.ed) >= T.SD)
                            OR (S.SD <= T.ED AND  decode(S.ED,NULL,'9999-12-31',s.ed) >= T.ED))
                            AND t.ed IS NOT NULL))
    我试验了几个值,应该没问题,你按照你的业务自己验证一下,不满足的举个例子
      

  2.   

    说一下逻辑哈,test1是要进行校验,通过语句查出来的值是可以插入到test里面的。。
      

  3.   

    WITH test AS(
    SELECT 1 ID,'2014-03-12' sd,'2013-03-22' ed FROM dual UNION ALL
    SELECT 2 ID,'2014-03-07' sd,NULL ed FROM dual UNION ALL
    SELECT 3 ID,'2014-03-09' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-05' sd,NULL ed FROM dual UNION ALL
    SELECT 5 ID,'2014-03-25' sd,'2014-03-30' ed FROM dual
    ), test1 AS(
    SELECT 1 ID,'2014-03-03' sd,'2013-03-04' ed FROM dual UNION ALL
    SELECT 2 ID,'2014-03-23' sd,NULL ed FROM dual UNION ALL
    SELECT 3 ID,'2014-03-09' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-05' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-03' sd,'2014-03-06' ed FROM dual UNION ALL
    SELECT 5 ID, '2014-03-25' SD, '2014-03-30' ED
      FROM DUAL)
    SELECT *
      FROM TEST1 T
     WHERE NOT (EXISTS (SELECT 1
                          FROM TEST S
                         WHERE S.SD = T.SD
                           AND S.ED IS NULL) AND t.ed IS NULL)
       AND NOT (EXISTS (SELECT 1
                          FROM TEST S
                         WHERE ((S.SD <= T.SD AND decode(S.ED,NULL,'9999-12-31',s.ed) >= T.SD)
                            OR (S.SD <= T.ED AND  decode(S.ED,NULL,'9999-12-31',s.ed) >= T.ED))
                            AND t.ed IS NOT NULL))
    我试验了几个值,应该没问题,你按照你的业务自己验证一下,不满足的举个例子
    还是不能满足  比如我test1加上个SELECT 6 ID,'2014-03-26' sd,NULL ed FROM dual UNION ALL这个应该是不允许的 因为26号在'2014-03-25' SD, '2014-03-30' 之间
    您的查询结果和我想要的是相反的 SQL执行出来是得到的是时间无交叉的结果  我想要是的是如果时间无交叉就不显示 如果有交叉就显示test中存在交叉的记录和id   test1中我是固定只查一个  而且只传日期不传id的
      

  4.   

    WITH test AS(
    SELECT 1 ID,'2014-03-12' sd,'2013-03-22' ed FROM dual UNION ALL
    SELECT 2 ID,'2014-03-07' sd,NULL ed FROM dual UNION ALL
    SELECT 3 ID,'2014-03-09' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-05' sd,NULL ed FROM dual UNION ALL
    SELECT 5 ID,'2014-03-25' sd,'2014-03-30' ed FROM dual
    ), test1 AS(
    SELECT 1 ID,'2014-03-03' sd,'2013-03-04' ed FROM dual UNION ALL
    SELECT 2 ID,'2014-03-23' sd,NULL ed FROM dual UNION ALL
    SELECT 3 ID,'2014-03-09' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-05' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-03' sd,'2014-03-06' ed FROM dual UNION ALL
    SELECT 5 ID, '2014-03-25' SD, '2014-03-30' ED
      FROM DUAL)
    SELECT *
      FROM TEST1 T
     WHERE NOT (EXISTS (SELECT 1
                          FROM TEST S
                         WHERE S.SD = T.SD
                           AND S.ED IS NULL) AND t.ed IS NULL)
       AND NOT (EXISTS (SELECT 1
                          FROM TEST S
                         WHERE ((S.SD <= T.SD AND decode(S.ED,NULL,'9999-12-31',s.ed) >= T.SD)
                            OR (S.SD <= T.ED AND  decode(S.ED,NULL,'9999-12-31',s.ed) >= T.ED))
                            AND t.ed IS NOT NULL))
    我试验了几个值,应该没问题,你按照你的业务自己验证一下,不满足的举个例子
    还是不能满足  比如我test1加上个SELECT 6 ID,'2014-03-26' sd,NULL ed FROM dual UNION ALL这个应该是不允许的 因为26号在'2014-03-25' SD, '2014-03-30' 之间
    您的查询结果和我想要的是相反的 SQL执行出来是得到的是时间无交叉的结果  我想要是的是如果时间无交叉就不显示 如果有交叉就显示test中存在交叉的记录和id   test1中我是固定只查一个  而且只传日期不传id的

    这个是给你写的一个校验的sql,校验你需要插入的值到底可以不可以。
    按你说的,再加个判断条件就可以了,如下:
    WITH test AS(SELECT 1 ID,'2014-03-12' sd,'2013-03-22' ed FROM dual UNION ALL
    SELECT 2 ID,'2014-03-07' sd,NULL ed FROM dual UNION ALL
    SELECT 3 ID,'2014-03-09' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-05' sd,NULL ed FROM dual UNION ALL
    SELECT 5 ID,'2014-03-25' sd,'2014-03-30' ed FROM dual), 
    test1 AS(SELECT 1 ID,'2014-03-03' sd,'2013-03-04' ed FROM dual UNION ALL
    SELECT 2 ID,'2014-03-23' sd,NULL ed FROM dual UNION ALL
    SELECT 3 ID,'2014-03-09' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-05' sd,NULL ed FROM dual UNION ALL
    SELECT 4 ID,'2014-03-03' sd,'2014-03-06' ed FROM dual UNION ALL
    SELECT 5 ID, '2014-03-25' SD, '2014-03-30' ED  FROM DUAL UNION ALL
    SELECT 6 ID,'2014-03-26' sd,NULL ed FROM dual)
    SELECT *
      FROM TEST1 T
     WHERE NOT (EXISTS (SELECT 1
                          FROM TEST S
                         WHERE S.SD = T.SD
                           AND S.ED IS NULL) AND T.ED IS NULL)
       AND NOT (EXISTS (SELECT 1
                          FROM TEST S
                         WHERE S.SD <= T.SD AND s.ed>=t.sd
                           AND S.ED IS NOT NULL) AND T.ED IS NULL)
       AND NOT (EXISTS (SELECT 1
                          FROM TEST S
                         WHERE ((S.SD <= T.SD AND
                               DECODE(S.ED, NULL, '9999-12-31', S.ED) >= T.SD) OR
                               (S.SD <= T.ED AND
                               DECODE(S.ED, NULL, '9999-12-31', S.ED) >= T.ED))
                           AND T.ED IS NOT NULL))
      

  5.   

    我知道你只传一个,传一个时候,就相当于test1中只有一条记录啊。。
    你不是需要检验时候可以插入么,通过sql判断一下就可以了啊。。