哎,终于做好了,要了我的老命了!哎!declare @sql varchar(8000),@i int
/*--------------------------------------------------------*/
select @sql='',@i=23
while @i>=0
 select @sql=',hour'+cast(@i as varchar)+' int'+@sql,@i=@i-1select @sql='create table t(companyid varchar(20)'+@sql+',d_time datetime)'select @sql=@sql+' insert into t select ''A001'' 'select @i=24while @i>0
 select @sql=@sql+','+right(cast(RAND(@i) as varchar),2),
        @i=@i-1select @sql=@sql+',''2005-10-19'' union all select ''A001'''select @i=100while @i>76
 select @sql=@sql+','+right(cast(RAND(@i) as varchar),2),
        @i=@i-1select @sql=@sql+',''2005-10-20'''exec(@sql)
/*--------------------以上数据是动态生成表格和数据的程序段-------------------*//*----------------------这里开始是程序段------------------------------------*/declare @t datetime
select @t='2005-10-20 8:00'
select * from t
select @sql=''select @sql='select * from (',@i=23
while @i>=0
select @sql=@sql+'
           select companyid,hour'+cast(@i as varchar)+' as num,d_time=dateadd(hour,'+cast(@i as varchar)+',d_time) from t
           union all'
       ,@i=@i-1select @sql=reverse(stuff(reverse(@sql),1,10,''))+'
        ) a
         where (datepart(hour,d_time) between 0 and datepart(hour,'''+convert(varchar,@t,120)+''') and
         convert(char(10),d_time,120)=convert(char(10),'''+convert(varchar,@t,120)+''',120))
         or (datediff(hour,d_time,'''+convert(char(11),dateadd(d,-1,@t),120)+'23:00'')<16
         and convert(char(10),d_time,120)='''+convert(char(10),dateadd(d,-1,@t),120)+''')
         order by d_time'
exec(@sql)
drop table t/*----------------下面是测试和结果数据---------------------*/(所影响的行数为 2 行)companyid            hour0       hour1       hour2       hour3       hour4       hour5       hour6       hour7       hour8       hour9       hour10      hour11      hour12      hour13      hour14      hour15      hour16      hour17      hour18      hour19      hour20      hour21      hour22      hour23      d_time                                                 
-------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ------------------------------------------------------ 
A001                 21          2           83          65          46          27          9           89          71          53          34          16          97          78          76          41          22          4           85          67          48          29          11          92          2005-10-19 00:00:00.000
A001                 37          18          99          81          62          43          25          6           88          69          25          32          13          94          76          57          39          12          1           83          64          45          27          8           2005-10-20 00:00:00.000(所影响的行数为 2 行)companyid            num         d_time                                                 
-------------------- ----------- ------------------------------------------------------ 
A001                 71          2005-10-19 08:00:00.000
A001                 53          2005-10-19 09:00:00.000
A001                 34          2005-10-19 10:00:00.000
A001                 16          2005-10-19 11:00:00.000
A001                 97          2005-10-19 12:00:00.000
A001                 78          2005-10-19 13:00:00.000
A001                 76          2005-10-19 14:00:00.000
A001                 41          2005-10-19 15:00:00.000
A001                 22          2005-10-19 16:00:00.000
A001                 4           2005-10-19 17:00:00.000
A001                 85          2005-10-19 18:00:00.000
A001                 67          2005-10-19 19:00:00.000
A001                 48          2005-10-19 20:00:00.000
A001                 29          2005-10-19 21:00:00.000
A001                 11          2005-10-19 22:00:00.000
A001                 92          2005-10-19 23:00:00.000
A001                 37          2005-10-20 00:00:00.000
A001                 18          2005-10-20 01:00:00.000
A001                 99          2005-10-20 02:00:00.000
A001                 81          2005-10-20 03:00:00.000
A001                 62          2005-10-20 04:00:00.000
A001                 43          2005-10-20 05:00:00.000
A001                 25          2005-10-20 06:00:00.000
A001                 6           2005-10-20 07:00:00.000
A001                 88          2005-10-20 08:00:00.000

解决方案 »

  1.   

    /*----------------------这里开始是程序段------------------------------------*/declare @t datetime
    select @t='2005-10-20 08:00'
    select * from t
    select @sql=''select @sql='select * from (',@i=23
    while @i>=0
    select @sql=@sql+'
               select companyid,hour'+cast(@i as varchar)+' as num,d_time=dateadd(hour,'+cast(@i as varchar)+',d_time) from t
               union all'
           ,@i=@i-1select @sql=reverse(stuff(reverse(@sql),1,10,''))+'
            ) a
             where (datepart(hour,d_time) between 0 and datepart(hour,'''+convert(varchar,@t,120)+''') and
             convert(char(10),d_time,120)=convert(char(10),'''+convert(varchar,@t,120)+''',120))
             or (datediff(hour,d_time,'''+convert(char(11),dateadd(d,-1,@t),120)+'23:00'')<
             '+cast(23-datepart(hour,@t) as varchar)+'
             and convert(char(10),d_time,120)='''+convert(char(10),dateadd(d,-1,@t),120)+''')
             order by d_time'
    exec(@sql)
     
    改了一下,刚才有个小问题。我测试了一下,对于'2005-10-20 08:00' 
    companyid            num         d_time                                                 
    -------------------- ----------- ------------------------------------------------------ 
    A001                 53          2005-10-19 09:00:00.000
    A001                 34          2005-10-19 10:00:00.000
    A001                 16          2005-10-19 11:00:00.000
    A001                 97          2005-10-19 12:00:00.000
    A001                 78          2005-10-19 13:00:00.000
    A001                 76          2005-10-19 14:00:00.000
    A001                 41          2005-10-19 15:00:00.000
    A001                 22          2005-10-19 16:00:00.000
    A001                 4           2005-10-19 17:00:00.000
    A001                 85          2005-10-19 18:00:00.000
    A001                 67          2005-10-19 19:00:00.000
    A001                 48          2005-10-19 20:00:00.000
    A001                 29          2005-10-19 21:00:00.000
    A001                 11          2005-10-19 22:00:00.000
    A001                 92          2005-10-19 23:00:00.000
    A001                 37          2005-10-20 00:00:00.000
    A001                 18          2005-10-20 01:00:00.000
    A001                 99          2005-10-20 02:00:00.000
    A001                 81          2005-10-20 03:00:00.000
    A001                 62          2005-10-20 04:00:00.000
    A001                 43          2005-10-20 05:00:00.000
    A001                 25          2005-10-20 06:00:00.000
    A001                 6           2005-10-20 07:00:00.000
    A001                 88          2005-10-20 08:00:00.000和'2005-10-20 23:00'的数据companyid            num         d_time                                                 
    -------------------- ----------- ------------------------------------------------------ 
    A001                 37          2005-10-20 00:00:00.000
    A001                 18          2005-10-20 01:00:00.000
    A001                 99          2005-10-20 02:00:00.000
    A001                 81          2005-10-20 03:00:00.000
    A001                 62          2005-10-20 04:00:00.000
    A001                 43          2005-10-20 05:00:00.000
    A001                 25          2005-10-20 06:00:00.000
    A001                 6           2005-10-20 07:00:00.000
    A001                 88          2005-10-20 08:00:00.000
    A001                 69          2005-10-20 09:00:00.000
    A001                 25          2005-10-20 10:00:00.000
    A001                 32          2005-10-20 11:00:00.000
    A001                 13          2005-10-20 12:00:00.000
    A001                 94          2005-10-20 13:00:00.000
    A001                 76          2005-10-20 14:00:00.000
    A001                 57          2005-10-20 15:00:00.000
    A001                 39          2005-10-20 16:00:00.000
    A001                 12          2005-10-20 17:00:00.000
    A001                 1           2005-10-20 18:00:00.000
    A001                 83          2005-10-20 19:00:00.000
    A001                 64          2005-10-20 20:00:00.000
    A001                 45          2005-10-20 21:00:00.000
    A001                 27          2005-10-20 22:00:00.000
    A001                 8           2005-10-20 23:00:00.000