有一表结构如下:
活动 开始时间 结束时间 参与人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 参与人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 张三 王麻子
写成存储过程或者函数都行,谢谢各位大侠哈~~
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)
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)));
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.结束时间 )
(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
--自己再按格式写成函数或存贮过程
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
*/
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='张三')