有一个用户注册的表,里面的数据是2007-12-10 05:20:13.000
2007-11-21 08:20:40.000
2007-12-03 04:21:31.000
2007-11-04 10:21:04.000我需要统计2007年11月5日到2007年12月15日之间每20个小时都有多少人注册了,也就是有几条记录。如果这个时间段内有15个20小时,要列出:15条记录,每一条记录代表一个20个小时,在这20个小时当中有几个人注册记录。0   0 <-- 开始计算时间是:2007年11月5日
20  2
40  0
60  3
...
共15条记录,最后一条记录的截止时间是到2007年12月15日

解决方案 »

  1.   

    select datediff(hh,time,'20071215')/20 ,count(*) from tb 
    where ...
    group by datediff(hh,time,'20071215')/20 datediff(hh,time,'20071215')/20   就是你的第几个20小时
      

  2.   

    --这是是每五分钟分段, 你改改就行了.
    [code=SQL]create table tb(时间 datetime , 金额 int)
    insert into tb values('2007-1-1 10:00:23' ,          8 )
    insert into tb values('2007-1-1 10:01:24' ,          4 )
    insert into tb values('2007-1-1 10:05:00' ,          2 )  
    insert into tb values('2007-1-1 10:06:12' ,          3 )
    insert into tb values('2007-1-1 10:08:00' ,          1 )
    insert into tb values('2007-1-1 10:12:11' ,          5 )
    go--时间段>=10:00:00 and 时间段<10:05:00
    select dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,-1,时间),120),dateadd(ss,-1,时间))/5)*5,convert(varchar(10),时间,120)) as 时间段,
           count(*) as 行数,
           sum(金额) as 总金额
    from tb
    group by dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,-1,时间),120),dateadd(ss,-1,时间))/5)*5,convert(varchar(10),时间,120))
    /*
    时间段                                                    行数          总金额         
    ------------------------------------------------------ ----------- ----------- 
    2007-01-01 10:00:00.000                                3           14
    2007-01-01 10:05:00.000                                2           4
    2007-01-01 10:10:00.000                                1           5
    (所影响的行数为 3 行)
    */--时间段>10:00:00 and 时间段<=10:05:00
    select dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,1,时间),120),dateadd(ss,1,时间))/5)*5,convert(varchar(10),时间,120)) as 时间段,
           count(*) as 行数,
           sum(金额) as 总金额
    from tb
    group by dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,1,时间),120),dateadd(ss,1,时间))/5)*5,convert(varchar(10),时间,120))
    /*
    时间段                                                    行数          总金额         
    ------------------------------------------------------ ----------- ----------- 
    2007-01-01 10:00:00.000                                2           12
    2007-01-01 10:05:00.000                                3           6
    2007-01-01 10:10:00.000                                1           5(所影响的行数为 3 行)
    */drop table tb[/code]
      

  3.   

    语法
    DATEDIFF ( datepart , startdate , enddate ) 参数
    datepart是规定了应在日期的哪一部分计算差额的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。