declare @start datetime
,@end datetimeselect @start='2005-8-13'
,@end='2005-9-1'select 姓名
,sum(case when 出差开始日期<=@start and 出差结束日期 between @start and @end
then datediff(day,@start,出差结束日期)
when 出差开始日期>=@start and 出差结束日期<=@end
then datediff(day,出差开始日期,出差结束日期)
when 出差开始日期>=@start and 出差结束日期>=@end and 出差开始日期<=@end
then datediff(day,出差开始日期,@end)
else 0
end
) as '出差天数'from 表
group by 姓名
order by 姓名
,@end datetimeselect @start='2005-8-13'
,@end='2005-9-1'select 姓名
,sum(case when 出差开始日期<=@start and 出差结束日期 between @start and @end
then datediff(day,@start,出差结束日期)
when 出差开始日期>=@start and 出差结束日期<=@end
then datediff(day,出差开始日期,出差结束日期)
when 出差开始日期>=@start and 出差结束日期>=@end and 出差开始日期<=@end
then datediff(day,出差开始日期,@end)
else 0
end
) as '出差天数'from 表
group by 姓名
order by 姓名
create table #T(出差序号 int,姓名 varchar(10),出差开始日期 datetime,出差结束日期 datetime)
insert into #T select 1,'李四','2005-8-06','2005-8-17'
insert into #T select 2,'李四','2005-8-20','2005-8-26'
insert into #T select 3,'张三','2005-8-11','2005-9-10'
insert into #T select 4,'王五','2005-8-30','2005-9-05'
--执行查询
select
a.姓名,
出差天数 = sum(datediff(dd,出差开始日期,出差结束日期))
from
(select
姓名,
出差开始日期 = case when 出差开始日期<'2005-08-13' and 出差结束日期>'2005-08-13' then '2005-08-13' else 出差开始日期 end,
出差结束日期 = case when 出差开始日期<'2005-09-01' and 出差结束日期>'2005-09-01' then '2005-09-01' else 出差结束日期 end
from
#T) a
where
a.出差开始日期 between '2005-08-13' and '2005-09-01'
group by
a.姓名
--输出结果
/*
姓名 出差天数
---- --------
李四 10
王五 2
张三 19
*/
--删除测试环境
drop table #T
,@end datetimeselect @start='2005-8-13'
,@end='2005-9-1'
create table #T(出差序号 int,姓名 varchar(10),出差开始日期 datetime,出差结束日期 datetime)
insert into #T select 1,'李四','2005-8-06','2005-8-17'
insert into #T select 2,'李四','2005-8-20','2005-8-26'
insert into #T select 3,'张三','2005-8-11','2005-9-10'
insert into #T select 4,'王五','2005-8-30','2005-9-05'select 姓名,
sum(case
when 出差开始日期>@start and 出差结束日期<@end then DATEDIFF ( dd , 出差开始日期 , 出差结束日期 )
when 出差开始日期<=@start and 出差结束日期<@end then DATEDIFF ( dd , @start , 出差结束日期 )
when 出差开始日期>@start and 出差结束日期>=@end then DATEDIFF ( dd , 出差开始日期 , @end )
else DATEDIFF ( dd , @start , @end ) end) as [date] from #T where 出差结束日期>=@start and 出差开始日期<=@end
group by 姓名drop table #T
declare @fromdt datetime
declare @todt datetime
set @fromdt='2005-8-13'
set @todt='2005-9-1'
create table #testtable
(
selfid int identity(1,1),
name varchar(20),
fromdt datetime,
todt datetime
)
insert into #testtable(name,fromdt,todt) values('李四','2005-8-6','2005-8-17')
insert into #testtable(name,fromdt,todt) values('李四','2005-8-20','2005-8-26')
insert into #testtable(name,fromdt,todt) values('张三','2005-8-11','2005-9-10')
insert into #testtable(name,fromdt,todt) values('王五','2005-8-30','2005-9-5')select name,sum(datediff(day,(case when fromdt<@fromdt then @fromdt when (fromdt>=@fromdt) and (fromdt<@todt) then fromdt else getdate() end),
(case when todt>@todt then @todt when (todt<=@todt) and (todt>@fromdt) then todt else getdate() end)))
from #testtable
group by name
drop table #testtable
end
的答案对的
libin_ftsafe(子陌红尘)的方法正确,vivianfdlpw()的方法缺少了一个判断条件,
--when 出差开始日期<=@start and 出差结束日期>=@end
then datediff(day,@start,@end)
select
'1' , '李四' , '2005-8-6' , '2005-8-17' union select
'2' , '李四' , '2005-8-20', '2005-8-26' union select
'3' , '张三' , '2005-8-11', '2005-9-10' union select
'4' , '王五' , '2005-8-30', '2005-9-5'
select * from @tdeclare @b datetime,@e datetime
select @b='2005-8-13',@e='2005-9-1'
select 姓名,f=sum(DATEDIFF(Day, case when @b>=出差开始日期 then @b else 出差开始日期 end,case when @e<=出差结束日期 then @e else 出差结束日期 end))
from @t
group by 姓名