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 姓名

解决方案 »

  1.   

    select sum(datediff(day,startday,endday)) from table group by name
      

  2.   

    --生成测试数据
    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
      

  3.   

    select name,sum(datediff(day,startday,endday) + 1) from table group by name
      

  4.   

    declare @start datetime
            ,@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
      

  5.   

    begin
    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
      

  6.   

    libin_ftsafe(子陌红尘) 
    的答案对的
      

  7.   

    感谢各位的解答,
    libin_ftsafe(子陌红尘)的方法正确,vivianfdlpw()的方法缺少了一个判断条件,
    --when 出差开始日期<=@start and 出差结束日期>=@end
                     then datediff(day,@start,@end)
      

  8.   

    declare @t table (出差序号 varchar(2),姓名 varchar(20),出差开始日期 datetime,出差结束日期 datetime)insert into @t 
    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 姓名