表A中有如下字段:id(number),code(varchar),type(number),start_tm(varchar),end_tm(varchar),start_week(number),end_week(number). 
code为代码,type为类型(只有1,和2),start_tm为开始时间从0000-2400,end_tm为结束时间从0000-2400,start_week为开始星期从1-7,end_week为结束星期从1-7. 
如(1,'AAAAA',1,'0000','2400',1,7)表示代码为'AAAAA'商家当类型为1时的有效时间是从星期一的'0000'到'2400'也就是从零点到24点,到星期日的'0000'到'2400'也就是从零点到24点; 
现在要求查出表中同一商家有效时间重叠‘交叉的记录。类型不要求相同 
有这几条记录 
(2,'AAAAA',1,'0000','2000',1,7)与(3,'AAAAA',2,'1800','0000',1,7)时间交叉 
(6,'CCCCC',1,'0000','2400',2,7)与(7,'CCCCC',2,'0000','2400',1,5)星期交叉 
(8,'DDDDD',1,'0800','2400',2,7)与(9,'DDDDD',2,'2200','0800',1,5)时间和星期都交叉 
(4,'BBBBB',1,'0000','2400',1,7)与(5,'BBBBB',2,'0800','2000',1,7)时间重叠 
(10,'EEEEE',1,'0000','2400',1,7)与(11,'EEEEE',2,'0000','2400',2,5)星期重叠 
(12,'GGGGG',1,'0800','2200',1,7)与(5,'GGGGG',2,'2100','0800',2,5)时间星期重叠 
另外还要查出不连续的数据如给'AAAAA'配置了星期一到星期三   和   星期六到星期日   而没有配星期四和星期五也要查出来 
同样时间也是一样不能有空缺,不连续请大家帮我看看了!先谢了!

解决方案 »

  1.   


    create table guest_time(
    id number,
    code varchar2(10),
    type number,
    start_tm varchar2(4),
    end_tm varchar2(4),
    start_week number,
    end_week number
    );  insert into guest_time values(2,'AAAAA',1,'0000','2000',1,7)  ;
    insert into guest_time values(3,'AAAAA',2,'1800','0000',1,7)  ; 
    insert into guest_time values(6,'CCCCC',1,'0000','2400',2,7)  ;
    insert into guest_time values(7,'CCCCC',2,'0000','2400',1,5)  ; 
    insert into guest_time values(8,'DDDDD',1,'0800','2400',2,7)  ;
    insert into guest_time values(9,'DDDDD',2,'2200','0800',1,5)  ;
    insert into guest_time values(4,'BBBBB',1,'0000','2400',1,7)  ;
    insert into guest_time values(5,'BBBBB',2,'0800','2000',1,7)  ;
    insert into guest_time values(10,'EEEEE',1,'0000','2400',1,7) ;
    insert into guest_time values(11,'EEEEE',2,'0000','2400',2,5) ;
    insert into guest_time values(12,'GGGGG',1,'0800','2200',1,7) ;
    insert into guest_time values(5,'GGGGG',2,'2100','0800',2,5)  ;
    insert into guest_time values(13,'HHHHH',1,'0000','2400',1,7)  ;
    insert into guest_time values(14,'HHHHH',2,'0000','2400',1,7)  ;
    insert into guest_time values(15,'IIIIII',1,'0000','2400',1,2)  ;
    insert into guest_time values(16,'IIIIII',2,'0000','2400',6,7)  ;
    insert into guest_time values(17,'JJJJJJ',1,'0000','2400',1,2)  ;
    insert into guest_time values(18,'JJJJJJ',2,'0000','2400',3,7)  ;
    insert into guest_time values(19,'KKKKKK',1,'0000','1800',1,2)  ;
    insert into guest_time values(20,'KKKKKK',2,'1801','2400',3,7)  ;select distinct(c.code) from(
    select max(g.id),g.code as code,max(g.type),g.start_tm,g.end_tm,g.start_week,g.end_week
     from guest_time g 
     group by g.code,g.start_tm,g.end_tm,g.start_week,g.end_week 
    having count(g.start_tm)<2 or count(g.end_tm)<2 or count(g.start_week)<2 or count(g.end_week)<2)  a,
    (select g.code as code,g.end_week,g.start_week,gt.start_week,gt.code as code3 from guest_time g,guest_time gt group by g.code,g.end_week,g.start_week,gt.start_week,gt.code having g.code=gt.code and g.end_week=gt.start_week-1 and gt.end_week=7)
    b,guest_time c
    where c.code=a.code and c.code!=b.code思路是这样的,先按
    code ,start_tm ,end_tm,start_week number,end_week number分组找出相交叉的时间和星期
    然后排除例如:
    配置了星期一到星期三 和       星期六到星期日       而没有配星期四和星期五
    然后再处理 时间不连续的(这步偶没做) 字符转数值to_number另外语句还可以优化下