34,593
社区成员
发帖
与我相关
我的任务
分享
declare @a table(name varchar(20),sdate smalldatetime)
insert @a select 'aaa','2007-10-11'
union all select 'aaa','2007-10-12'
union all select 'aaa','2007-10-13'
union all select 'aaa','2007-10-14'
union all select 'aaa','2007-10-15'
union all select 'aaa','2007-10-16'
union all select 'aaa','2007-10-17'
union all select 'aaa','2007-10-18'
union all select 'aaa','2007-10-19'
union all select 'aaa','2007-10-20'
union all select 'aaa','2007-10-21'
union all select 'bbb','2007-10-11'
union all select 'bbb','2007-10-12'
union all select 'bbb','2007-10-13'
union all select 'bbb','2007-10-14'
union all select 'bbb','2007-10-15'
union all select 'bbb','2007-10-16'
union all select 'bbb','2007-10-17'
union all select 'bbb','2007-10-18'
union all select 'bbb','2007-10-19'
union all select 'bbb','2007-10-20'
union all select 'bbb','2007-10-21'
declare @b table(name varchar(20),start_date smalldatetime,end_date smalldatetime)
insert @b select 'aaa','2007-10-12','2007-10-15'
union all select 'aaa','2007-10-18','2007-10-20'
union all select 'bbb','2007-10-14','2007-10-17'
select *,case when exists(select 1 from @b where name=a.name and sdate between start_date and end_date) then 1 else 0 end
from @a a
--result
/*name sdate
-------------------- ------------------------------------------------------ -----------
aaa 2007-10-11 00:00:00 0
aaa 2007-10-12 00:00:00 1
aaa 2007-10-13 00:00:00 1
aaa 2007-10-14 00:00:00 1
aaa 2007-10-15 00:00:00 1
aaa 2007-10-16 00:00:00 0
aaa 2007-10-17 00:00:00 0
aaa 2007-10-18 00:00:00 1
aaa 2007-10-19 00:00:00 1
aaa 2007-10-20 00:00:00 1
aaa 2007-10-21 00:00:00 0
bbb 2007-10-11 00:00:00 0
bbb 2007-10-12 00:00:00 0
bbb 2007-10-13 00:00:00 0
bbb 2007-10-14 00:00:00 1
bbb 2007-10-15 00:00:00 1
bbb 2007-10-16 00:00:00 1
bbb 2007-10-17 00:00:00 1
bbb 2007-10-18 00:00:00 0
bbb 2007-10-19 00:00:00 0
bbb 2007-10-20 00:00:00 0
bbb 2007-10-21 00:00:00 0
*/
create table A (name varchar(10),sdate datetime)
insert into A values('aaa','2007-10-11')
insert into A values('aaa','2007-10-12')
insert into A values('aaa','2007-10-13')
insert into A values('aaa','2007-10-14')
insert into A values('aaa','2007-10-15')
insert into A values('aaa','2007-10-16')
insert into A values('aaa','2007-10-17')
insert into A values('aaa','2007-10-18')
insert into A values('aaa','2007-10-19')
insert into A values('aaa','2007-10-20')
insert into A values('aaa','2007-10-21')
insert into A values('bbb','2007-10-11')
insert into A values('bbb','2007-10-12')
insert into A values('bbb','2007-10-13')
insert into A values('bbb','2007-10-14')
insert into A values('bbb','2007-10-15')
insert into A values('bbb','2007-10-16')
insert into A values('bbb','2007-10-17')
insert into A values('bbb','2007-10-18')
insert into A values('bbb','2007-10-19')
insert into A values('bbb','2007-10-20')
insert into A values('bbb','2007-10-21')
create table B(name varchar(10),start_date datetime,end_date datetime)
insert into B values('aaa','2007-10-12','2007-10-15')
insert into B values('aaa','2007-10-18','2007-10-20')
insert into B values('bbb','2007-10-14','2007-10-17')
go
select top 8000 identity(int,0,1) as id into tmp from syscolumns a,syscolumns b
select a.* , isnull(t.cnt,0) fix from A left join
(select b.name , dateadd(day , c.id , b.start_date) start_date , count(*) cnt from B ,tmp C where dateadd(day , C.id , b.start_date) <= b.end_date group by b.name , dateadd(day , c.id , b.start_date)) t
on a.name = t.name and a.sdate = t.start_date
order by a.name , a.sdate
drop table a,b,tmp
/*
name sdate fix
---------- ------------------------------------------------------ -----------
aaa 2007-10-11 00:00:00.000 0
aaa 2007-10-12 00:00:00.000 1
aaa 2007-10-13 00:00:00.000 1
aaa 2007-10-14 00:00:00.000 1
aaa 2007-10-15 00:00:00.000 1
aaa 2007-10-16 00:00:00.000 0
aaa 2007-10-17 00:00:00.000 0
aaa 2007-10-18 00:00:00.000 1
aaa 2007-10-19 00:00:00.000 1
aaa 2007-10-20 00:00:00.000 1
aaa 2007-10-21 00:00:00.000 0
bbb 2007-10-11 00:00:00.000 0
bbb 2007-10-12 00:00:00.000 0
bbb 2007-10-13 00:00:00.000 0
bbb 2007-10-14 00:00:00.000 1
bbb 2007-10-15 00:00:00.000 1
bbb 2007-10-16 00:00:00.000 1
bbb 2007-10-17 00:00:00.000 1
bbb 2007-10-18 00:00:00.000 0
bbb 2007-10-19 00:00:00.000 0
bbb 2007-10-20 00:00:00.000 0
bbb 2007-10-21 00:00:00.000 0
(所影响的行数为 22 行)
*/