if object_id('date') is not null
drop table date
go
create table date(dt datetime,isoffday tinyint)
go
declare @startdate datetime,@enddate datetime
set @startdate = '2008-01-01'
set @enddate = '2009-01-01'
while @startdate<@enddate
begin
insert into date(dt,isoffday) select @startdate,case when (datepart(dw,@startdate)+@@datefirst-1)%7 in(0,6) then 1 else 0 end
set @startdate = @startdate + 1
enddeclare @tb table (name varchar(50),startdate datetime,enddate datetime)
insert into @tb select 'wzy_love_sly','2008-08-01','2008-08-03'
insert into @tb select 'wzy_love_sly','2008-08-05','2008-08-25'
insert into @tb select 'wzy_love_sly','2008-08-25','2008-08-25'
insert into @tb select 'kaukiyou','2008-08-25','2008-08-25'select name as 员工,sum(days) as 工作天数,sum(days)*100 as 工资 from (
select *,(select count(1) from date where dt between t.startdate and t.enddate and isoffday=0)as days 
from @tb t)t group by name员工 工作天数 工资
kaukiyou 1 100
wzy_love_sly 17 1700

解决方案 »

  1.   

    参考如下的东西:ID         开始时刻                    结束时刻
    134217743   2007-01-22 23:00:06.000 2007-01-23 23:04:34.000
    134217838   2007-01-23 22:52:20.000 2007-01-23 23:04:44.000
    现在需要统计出,每天每个小时每类ID的在线人数,只要有在某个小时段内就算在线一次,如第二条记录134217838 2007-01-23 22:52:20.000 2007-01-23 23:04:44.000
    则需统计出:
    134217838 2007-01-23   22
    134217838 2007-01-23   23
    第一条则统计出:
    134217743 2007-01-22   23
    134217743 2007-01-23   0
    134217743 2007-01-23   1
      。
      。
      。
    134217743 2007-01-23   22
    134217743 2007-01-23   23
    谢谢各位!帮忙解决问题,帮忙顶!
    declare @a table(ID varchar(20),开始时刻 smalldatetime,结束时刻 smalldatetime)
    insert @a select '134217743','2007-01-22 23:00:06.000','2007-01-23 23:04:34.000'
    union all select '134217838','2007-01-23 22:52:20.000','2007-01-23 23:04:44.000'select top 100 id=identity( int,0,1) into # from syscolumns a,syscolumns bselect a.id,
    convert(varchar(10),dateadd(hour,b.id,开始时刻),120)日期,
    datepart(hour,dateadd(hour,b.id,开始时刻)) 时间数
    from @a a,# b
    where datediff(hour,dateadd(hour,b.id,开始时刻),结束时刻)>=0
    order by a.id,日期,时间数drop table #
    /*
    id                   日期         时间数         
    -------------------- ---------- ----------- 
    134217743            2007-01-22 23
    134217743            2007-01-23 0
    134217743            2007-01-23 1
    134217743            2007-01-23 2
    134217743            2007-01-23 3
    134217743            2007-01-23 4
    134217743            2007-01-23 5
    134217743            2007-01-23 6
    134217743            2007-01-23 7
    134217743            2007-01-23 8
    134217743            2007-01-23 9
    134217743            2007-01-23 10
    134217743            2007-01-23 11
    134217743            2007-01-23 12
    134217743            2007-01-23 13
    134217743            2007-01-23 14
    134217743            2007-01-23 15
    134217743            2007-01-23 16
    134217743            2007-01-23 17
    134217743            2007-01-23 18
    134217743            2007-01-23 19
    134217743            2007-01-23 20
    134217743            2007-01-23 21
    134217743            2007-01-23 22
    134217743            2007-01-23 23
    134217838            2007-01-23 22
    134217838            2007-01-23 23(所影响的行数为 27 行)*/
      

  2.   

    if object_id('date') is not null
    drop table date
    go
    create table date(dt datetime,isoffday tinyint)
    go
    declare @startdate datetime,@enddate datetime
    set @startdate = '2008-01-01'
    set @enddate = '2009-01-01'
    while @startdate<@enddate
    begin
    insert into date(dt,isoffday) select @startdate,case when (datepart(dw,@startdate)+@@datefirst-1)%7 in(0,6) then 1 else 0 end
    set @startdate = @startdate + 1
    enddeclare @tb table (name varchar(50),startdate datetime,enddate datetime)
    insert into @tb select 'wzy_love_sly','2008-08-01','2008-08-03'
    insert into @tb select 'wzy_love_sly','2008-08-05','2008-08-25'
    insert into @tb select 'wzy_love_sly','2008-08-25','2008-08-25'
    insert into @tb select 'kaukiyou','2008-08-25','2008-08-25'select name as 员工,count(1) as 工作天数,count(1)*100 as 工资 from (
    select distinct a.name,b.dt from @tb a join date b on b.dt between a.startdate and a.enddate
    where b.isoffday=0)t 
    group by name员工 工作天数 工资
    kaukiyou 1 100
    wzy_love_sly 16 1600还是我工资多....
      

  3.   

    帅哥,那个date table存在哪里? 要不要弄完时删掉?