SQLServer 統計24小時內數據,按小時展示。


ALTER PROCEDURE [dbo].[PROC_ROUTINE_GAME_STATISTICS]  
     @minDate NVARCHAR(50) --開始時間  
     ,@maxDate NVARCHAR(50) --結束時間  
     ,@timeType NVARCHAR(5) = null  --上下線類型  
     ,@ProjectId NVARCHAR(32) = NULL--項目ID  
AS  
BEGIN  
  
  SET NOCOUNT ON;  
    DECLARE @SQLSTR NVARCHAR(MAX),@SQLColumns NVARCHAR(Max),  
                        @HourO NVARCHAR(Max),@HourN NVARCHAR(Max)  
  
    SET @SQLColumns=N'convert(char(10),dateadd(d,number,'''+@minDate+'''),120) as INSERTDATE,'  
  
    --循環拼接字符串  
    declare @i int     
    set @i=0  
    while @i<23  
    BEGIN  
    --判斷i是否小於10  
    if(@i<10)  
    BEGIN--小於10在前面追加0  
    SET @HourO=N'0'+convert(varchar,@i)+':00'  
    if(@i<9)--@HourN需要加1所以判斷是否小於9  
    BEGIN--小於9在前面追加0  
    SET @HourN=N'0'+convert(varchar,(@i+1))+':00'  
    END  
    else  
    BEGIN--大於等於9直接使用  
    SET @HourN=convert(varchar,(@i+1))+':00'  
    END  
    END  
    else  
    BEGIN--大於等於10直接使用  
    SET @HourO=convert(varchar,@i)+':00'  
    SET @HourN=convert(varchar,(@i+1))+':00'  
    END  
    --拼接字符串  
    SET @SQLColumns+=N'sum(case when convert(char(8),INSERTDATE,108) between '''+@HourO+''' and '''+@HourN+''' then 1 else 0 end) as '''+@HourO+'~'+@HourN+''','  
    SET @i=@i +1   
    END  
    --根據時間段統計數據  
    SET @SQLSTR=N'select '+@SQLColumns+'   
                count(*) as ''sum''  
                from TIME_INFO a right join   
                master..spt_values b on datediff(d,INSERTDATE,dateadd(d,number,'''+@minDate+''')) = 0  
                where dateadd(d,number,'''+@minDate+''') <= '''+@maxDate+'''   
                and b.type = ''p'' and b.number >= 0  
                and TIME_TYPE='+@timeType+' and GAME_ID='''+@ProjectId+'''  
                group by convert(char(10),dateadd(d,number,'''+@minDate+'''),120)'  
  
    --print @SQLSTR  
    EXEC (@SQLSTR)  
END  
DECLARE @minDate datetime,@maxDate datetime;  
SELECT @minDate = '2009-11-1',@maxDate = '2009-12-01';  
  
select convert(char(10),dateadd(d,number,@minDate),120),  
sum(case when convert(char(8),時間,108) between '00:00' and '01:00' then 1 else 0 end) as '00:00~01:00',  
sum(case when convert(char(8),時間,108) between '01:00' and '02:00' then 1 else 0 end) as '01:00~02:00',  
sum(case when convert(char(8),時間,108) between '02:00' and '03:00' then 1 else 0 end) as '02:00~03:00',  
sum(case when convert(char(8),時間,108) between '03:00' and '04:00' then 1 else 0 end) as '03:00~04:00',  
sum(case when convert(char(8),時間,108) between '04:00' and '05:00' then 1 else 0 end) as '04:00~05:00',  
sum(case when convert(char(8),時間,108) between '05:00' and '06:00' then 1 else 0 end) as '05:00~06:00',  
sum(case when convert(char(8),時間,108) between '06:00' and '07:00' then 1 else 0 end) as '06:00~07:00',  
sum(case when convert(char(8),時間,108) between '07:00' and '08:00' then 1 else 0 end) as '07:00~08:00',  
sum(case when convert(char(8),時間,108) between '08:00' and '09:00' then 1 else 0 end) as '08:00~09:00',count(a.列名1) as 'sum'  
from #tb a right join   
master..spt_values b on datediff(d,時間,dateadd(d,number,@minDate)) = 0  
where dateadd(d,number,@minDate) <= @maxDate and b.type = 'p' and b.number >= 0  
group by convert(char(10),dateadd(d,number,@minDate),120)  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM