有一表结构如下:
活动   开始时间  结束时间  参与人1   参与人2   参与人 3
活动1  2011-5-1  2011-5-2  张三       李四
活动2  2011-5-3  2011-5-4             李四     王麻子
活动3  2011-5-1  2011-5-2             张三     王麻子想实现如下功能,判断在同一个时间段中是否有同一个人参加不同活动,如果有,找出全部相关活动记录,简单点就是做到同一个人在同一时间段不能参加不同活动。上面示例数据如果查找张三的话输出结果如下:
活动1  2011-5-1  2011-5-2  张三       李四
活动3  2011-5-1  2011-5-2             张三     王麻子
写成存储过程或者函数都行,谢谢各位大侠哈~~

解决方案 »

  1.   

    create table #A( A int )
    insert #A
    select 1 union all
    select 3 union all
    select 4 union all
    select 8 union all
    select 7 
    create table #B( B int )
    insert #B
    select 2 union all
    select 3 union all
    select 6 union all
    select 8 union all
    select 9select * from #A where checksum(*)not in (select checksum(*) from #B)
      

  2.   

    select * from tableName
    where userName = '张三'
    and 
    ((CONVERT (VARCHAR (100), Start_Date, 112) <= CONVERT (VARCHAR (100), CONVERT (DATETIME, @StartDate), 112)
    AND CONVERT (VARCHAR (100), End_Date, 112) >= CONVERT (VARCHAR (100), CONVERT (DATETIME, @EndDate), 112))
    OR
    (CONVERT (VARCHAR (100), Start_Date, 112) >= CONVERT (VARCHAR (100), CONVERT (DATETIME, @StartDate), 112)
    AND CONVERT (VARCHAR (100), Start_Date, 112) <= CONVERT (VARCHAR (100), CONVERT (DATETIME, @EndDate), 112))
    OR
    (CONVERT (VARCHAR (100), End_Date, 112) >= CONVERT (VARCHAR (100), CONVERT (DATETIME, @StartDate), 112)
    AND CONVERT (VARCHAR (100), End_Date, 112) <= CONVERT (VARCHAR (100), CONVERT (DATETIME, @EndDate), 112)));
      

  3.   

    select a.*
    from table1 a,table1 b
    where (a.参与人1 like '%张三%' or a.参与人2 like '%张三%' or a.参与人3 like '%张三%')
    and (b.参与人1 like '%张三%' or b.参与人2 like '%张三%' or b.参与人3 like '%张三%')
    and a.活动1 <> b.活动2
    and (b.开始时间 between a.开始时间 and a.结束时间 or b.结束时间 between a.开始时间 and a.结束时间 )
      

  4.   

    declare @name='张三'select a.* from tb a inner join
    (select 开始时间,结束时间 from tb 
    where 参与人1=@name or 参与人2=@name or 参与人3=@name) 
    group by  开始时间,结束时间
    having count(1)>1) b 
    on a.开始时间=b.开始时间
    and a.结束时间=b.结束时间
    and a.参与人1=@name or a.参与人2=@name or a.参与人3=@name
    --自己再按格式写成函数或存贮过程
      

  5.   


    create table table1(活动 varchar(20) null,
    开始时间  datetime null,
    结束时间 datetime null,
    参与人1 varchar(20) null,
    参与人2 varchar(20) null,
    参与人3 varchar(20) null
    )
    insert into table1(活动,开始时间,结束时间,参与人1,参与人2)
    select '活动1','2011-5-1','2011-5-2', '张三','李四'
    union all
    select '活动2','2011-5-3','2011-5-4','李四','王麻子'
    union all
    select '活动3','2011-5-1','2011-5-2','张三','王麻子'select a.*
    from table1 a,table1 b
    where (a.参与人1 like '%张三%' or a.参与人2 like '%张三%' or a.参与人3 like '%张三%')
    and (b.参与人1 like '%张三%' or b.参与人2 like '%张三%' or b.参与人3 like '%张三%')
    and a.活动 <> b.活动
    and (b.开始时间 between a.开始时间 and a.结束时间 or b.结束时间 between a.开始时间 and a.结束时间)--查询结果
    /*
    活动3 2011-05-01 00:00:00.000 2011-05-02 00:00:00.000 张三 王麻子 NULL
    活动1 2011-05-01 00:00:00.000 2011-05-02 00:00:00.000 张三 李四 NULL
    */
      

  6.   


    create table t1
    (
    a varchar(50),
    b varchar(50),
    c varchar(50),
    d varchar(50),
    e varchar(50)
    )
    insert into t1
    select '活动1', '2011-5-1', '2011-5-2', '张三', '李四' union all
    select '活动2', '2011-5-3', '2011-5-4', '李四', '王麻子' union all
    select '活动3', '2011-5-1', '2011-5-2', '张三', '王麻子'
    select * from t1select * from t1 a where exists (select 1 from t1 where b=a.b and c=a.c and d=a.d and d='张三')
      

  7.   

    修改下:select * from t1 a where exists (select 1 from t1 where b=a.b and c=a.c and d=a.d and (d='张三' or e='张三' or f='张三'))最后的(d='张三' or e='张三' or f='张三')里面可以根据有几个参与人就写几个