主键:姓名+类别+起始日期姓名    类别     起始日期     终止日期    说明
赵       A       2002.4.1     2004.4.1    赵在这个区间属于A类人员
赵       B       2004.4.1     2006.4.1    赵在这个区间属于B类人员
赵       A       2008.6.1     2008.4.1    赵在这个区间再次属于A类人员
以上都是正确的。但是由于维护问题,出现交叉情况:
赵       B       2003.5.1     2006.5.1    赵在这个区间被属于C类人员如何把日期交叉的记录查出来?或把日期交叉的人员查出来即可?

解决方案 »

  1.   

    select * from 表 A where exists (select 1 from 表 where A.姓名=姓名 and A.起始日期 between 起始日期 and 终止日期 or A.终止日期 between 起始日期 and 终止日期)
      

  2.   

    to playwarcraft:
    呵呵,不好意思,我理解错误。
    其实数据库中是以代码保存的,为了方便,我这里写的是名字。
    代码是不会重复的。to wgzaaa:
    你的语句道理好像不行啊。
      

  3.   

    不知道我有没有理解题义
    如果我以数字(int)举例
    User1 1-2(1,2)
    User2 1-4(1,2,3,4)
    User3 3-4(3,4)User1,User2有重复,
    User2,User3有重复
    但User1,User3没有重复你想要的是什么样的结果
      

  4.   

    你的交叉日期是不是第3条记录?  
     赵       A       2008.6.1     2008.4.1    赵在这个区间再次属于A类人员这个明显第一个日期要比第二个日期大   where (起始日期 > 终止日期) 这样可以不?
      

  5.   

    试试下面的语句(要加一个自增字段id)
    select * from tb  a,
    (select * from tb)b
    where a.name=b.name 
       and a.id=b.id-1
       and a.time_end>b.time_begin
    order by name,time_begin如果不增加自增字段
    select * from tb  a,
    (select * from tb)b
    where a.name=b.name 
    and b.time_begin>a.time_begin 
    and b.time_begin=(select min(time_begin) from tb where time_begin>a.time_begin)
    and a.time_end>b.time_begin
    order by name,time_begin 思路:相邻的两条记录,如果前一条的结束时间大于后一条记录开始时间,则显示这条记录
      

  6.   

    wgzaaa() 的语句需把自身语句除外才行,不然返回所有记录??
    加一个条件把自身排除就行了。
    看来没有主键的表是不好用的,需要加一个id字段才行。select 1 id,'赵' 姓名,'A' 类别,'2002.4.1' 起始日期,'2004.3.31' 终止日期 into 表
    union select 2,'赵','B','2004.4.1','2006.5.31'
    union select 3,'赵','A','2008.6.1','2008.9.2'
    union select 4,'赵','B','2003.4.1','2004.1.2'select * from 表--有交叉的记录
    select * from 表 A 
    where exists (
        select 1 from 表 
        where 姓名=A.姓名 
        and id<>A.id
        and    (起始日期 between A.起始日期 and A.终止日期 
             or 终止日期 between A.起始日期 and A.终止日期)
        )
    --交叉的记录
    select * from 表 A where exists (select 1 from 表 where A.姓名=姓名 and (A.起始日期 between 起始日期 and 终止日期 or A.终止日期 between 起始日期 and 终止日期) and A.id<>id)--这个就是wgzaaa() 那个加了个条件
    drop table 表
      

  7.   

    to rubiki:
    这个问题可以用开、闭区间区分啊。
    如:(起始日期,终止日期],表示:起始日期 < date <= 终止日期。