select * from tb a
where exists(
select 1 from tb 
where 請假類型<>a.請假類型 and
(工號=a.工號
and 請假開始日期時間=a.請假開始日期時間
and 請假結束日期時間=a.請假結束日期時間
or 
工號=a.工號
and a.請假開始日期時間 
between 請假開始日期時間  and 請假結束日期時間))

解决方案 »

  1.   


    --测试--测试数据
    create table tb(工號 varchar(10),請假開始日期時間 datetime,請假結束日期時間 datetime,請假類型 char(1))
    insert tb select 'A001','2004-07-01 12:00','2004-07-01 18:00','A'
    union all select 'A001','2004-07-01 12:00','2004-07-01 18:00','B'
    union all select 'A001','2004-07-01 17:00','2004-07-01 22:00','C'
    union all select 'B001','2004-07-02 12:00','2004-07-02 17:00','B'
    union all select 'C001','2004-07-03 12:00','2004-07-03 19:00','C'
    go--查询
    select * from tb a
    where exists(
    select 1 from tb 
    where 請假類型<>a.請假類型 and
    (工號=a.工號
    and 請假開始日期時間=a.請假開始日期時間
    and 請假結束日期時間=a.請假結束日期時間
    or 
    工號=a.工號
    and a.請假開始日期時間 
    between 請假開始日期時間  and 請假結束日期時間))
    go--删除测试
    drop table tb/*--测试结果工號         請假開始日期時間         請假結束日期時間         請假類型 
    ---------- ------------------------ ------------------------ ---------
    A001       2004-07-01 12:00:00.000  2004-07-01 18:00:00.000  A
    A001       2004-07-01 12:00:00.000  2004-07-01 18:00:00.000  B
    A001       2004-07-01 17:00:00.000  2004-07-01 22:00:00.000  C(所影响的行数为 3 行)
    --*/
      

  2.   

    如果是以下數據怎麼辦?A001    2004-07-01 12:00    2004-07-01 18:00    A 
    A001    2004-07-01 12:00    2004-07-01 18:00    A 有重復
    A001    2004-07-01 17:00    2004-07-01 22:00    A 時間交叉
      

  3.   

    解決:select * from T_AEMPH a
    where (
    select COUNT(*)  from T_AEMPH 
    where 
    (EMPCODE=a.EMPCODE
    and DATETIMEF=a.DATETIMEF
    and DATETIMET=a.DATETIMET
    or 
    EMPCODE=a.EMPCODE
    and a.DATETIMEF 
    between DATETIMEF  and DATETIMET)) >1