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)