SQLServer 统计24小时内数据,按小时展示。

  • A+
所属分类:SQLServer

SQLServer 统计24小时内数据,按小时展示。

自己改进版-存储过程

  1. ALTER PROCEDURE [dbo].[PROC_ROUTINE_GAME_STATISTICS]  
  2.      @minDate NVARCHAR(50) --开始时间  
  3.      ,@maxDate NVARCHAR(50) --结束时间  
  4.      ,@timeType NVARCHAR(5) = null  --上下线类型  
  5.      ,@ProjectId NVARCHAR(32) = NULL--项目ID  
  6. AS  
  7. BEGIN  
  8.   
  9.   SET NOCOUNT ON;  
  10.     DECLARE @SQLSTR NVARCHAR(MAX),@SQLColumns NVARCHAR(Max),  
  11.                         @HourO NVARCHAR(Max),@HourN NVARCHAR(Max)  
  12.   
  13.     SET @SQLColumns=N'convert(char(10),dateadd(d,number,'''+@minDate+'''),120) as INSERTDATE,'  
  14.   
  15.     --循环拼接字符串  
  16.     declare @i int     
  17.     set @i=0  
  18.     while @i<23  
  19.     BEGIN  
  20.     --判断i是否小于10  
  21.     if(@i<10)  
  22.     BEGIN--小于10在前面追加0  
  23.     SET @HourO=N'0'+convert(varchar,@i)+':00'  
  24.     if(@i<9)--@HourN需要加1所以判断是否小于9  
  25.     BEGIN--小于9在前面追加0  
  26.     SET @HourN=N'0'+convert(varchar,(@i+1))+':00'  
  27.     END  
  28.     else  
  29.     BEGIN--大于等于9直接使用  
  30.     SET @HourN=convert(varchar,(@i+1))+':00'  
  31.     END  
  32.     END  
  33.     else  
  34.     BEGIN--大于等于10直接使用  
  35.     SET @HourO=convert(varchar,@i)+':00'  
  36.     SET @HourN=convert(varchar,(@i+1))+':00'  
  37.     END  
  38.     --拼接字符串  
  39.     SET @SQLColumns+=N'sum(case when convert(char(8),INSERTDATE,108) between '''+@HourO+''and '''+@HourN+''then 1 else 0 endas '''+@HourO+'~'+@HourN+''','  
  40.     SET @i=@i +1   
  41.     END  
  42.     --根据时间段统计数据  
  43.     SET @SQLSTR=N'select '+@SQLColumns+'   
  44.                 count(*) as ''sum''  
  45.                 from TIME_INFO a right join   
  46.                 master..spt_values b on datediff(d,INSERTDATE,dateadd(d,number,'''+@minDate+''')) = 0  
  47.                 where dateadd(d,number,'''+@minDate+''') <= '''+@maxDate+'''   
  48.                 and b.type = ''p'' and b.number >= 0  
  49.                 and TIME_TYPE='+@timeType+' and GAME_ID='''+@ProjectId+'''  
  50.                 group by convert(char(10),dateadd(d,number,'''+@minDate+'''),120)'  
  51.   
  52.     --print @SQLSTR  
  53.     EXEC (@SQLSTR)  
  54. END  

执行结果

SQLServer 统计24小时内数据,按小时展示。

备查直接贴代码--引用网上

  1. DECLARE @minDate datetime,@maxDate datetime;  
  2. SELECT @minDate = '2009-11-1',@maxDate = '2009-12-01';  
  3.   
  4. select convert(char(10),dateadd(d,number,@minDate),120),  
  5. sum(case when convert(char(8),时间,108) between '00:00' and '01:00' then 1 else 0 endas '00:00~01:00',  
  6. sum(case when convert(char(8),时间,108) between '01:00' and '02:00' then 1 else 0 endas '01:00~02:00',  
  7. sum(case when convert(char(8),时间,108) between '02:00' and '03:00' then 1 else 0 endas '02:00~03:00',  
  8. sum(case when convert(char(8),时间,108) between '03:00' and '04:00' then 1 else 0 endas '03:00~04:00',  
  9. sum(case when convert(char(8),时间,108) between '04:00' and '05:00' then 1 else 0 endas '04:00~05:00',  
  10. sum(case when convert(char(8),时间,108) between '05:00' and '06:00' then 1 else 0 endas '05:00~06:00',  
  11. sum(case when convert(char(8),时间,108) between '06:00' and '07:00' then 1 else 0 endas '06:00~07:00',  
  12. sum(case when convert(char(8),时间,108) between '07:00' and '08:00' then 1 else 0 endas '07:00~08:00',  
  13. sum(case when convert(char(8),时间,108) between '08:00' and '09:00' then 1 else 0 endas '08:00~09:00',count(a.列名1) as 'sum'  
  14. from #tb a right join   
  15. master..spt_values b on datediff(d,时间,dateadd(d,number,@minDate)) = 0  
  16. where dateadd(d,number,@minDate) <= @maxDate and b.type = 'p' and b.number >= 0  
  17. group by convert(char(10),dateadd(d,number,@minDate),120)  
钰玺

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: