天天看點

SQL動态日期列統計

1.先了解下原理(看不懂可以,拿到資料庫執行,看效果。這個是循環到 - 日,下面的執行個體是循環到 - 月)

/*
  輸入2015-07-05,輸出2015-07-01 至 2015-07-05
*/
CREATE TABLE #dt_date(date VARCHAR(10))
DECLARE @ThisDate VARCHAR(10),@EndDate VARCHAR(10)
SET @EndDate='2015-07-05'
SET @ThisDate=CONVERT(VARCHAR(7),@EndDate)+'-01'

while(cast(@ThisDate as datetime)<=cast(@EndDate as datetime))
begin
  INSERT INTO #dt_date(date) VALUES(@ThisDate)
  SET @ThisDate=CONVERT(VARCHAR(10),dateadd(day,1,cast(@ThisDate as datetime)),120)
end

SELECT * FROM #dt_date

DROP TABLE #dt_date      

2.效果示範(起始日期為:2015-01,結束日期為:2015-04,時間部分全部為動态生成。

無限跨年份)

SQL動态日期列統計
/*
EXEC usp_CRM_PerformanceReport '2015-01','2016-3',' AND BusinessTypeID=2'
*/
ALTER PROC usp_CRM_PerformanceReport
@ThisDate VARCHAR(10),
@EndDate VARCHAR(10),
@strWhere NVARCHAR(4000)
AS

SET @ThisDate=@ThisDate+'-01'
SET @EndDate=@EndDate+'-01'

DECLARE @StrSQL nvarchar(max)

SET @StrSQL='
;with dt_pager AS(
select vw_p.CustomerID,
vw_p.CustomerName,vw_p.BusinessTypeName,vw_p.BusinessTypeID,vw_p.PerformanceID,vw_p.Device,vw_p.District,
vw_p.UseBeginTime,vw_p.UseEndTime,vw_p.Pay,vw_p.PayName,vw_p.DistrictName,vw_p.FillManName,vw_p.DeductAmount,vw_p.LoadPhone 
,tbl_m.MacthDate
'

while(cast(@ThisDate as datetime)<=cast(@EndDate as datetime))
begin
  
  --SELECT @ThisDate
  SET @StrSQL=@StrSQL+',(CASE WHEN tbl_m.MacthDate=CONVERT(DATETIME,'''+@ThisDate+''') THEN ''<label style=color:red;>已繳</label>'' ELSE ''<label style="color: #CDCDCD;">未繳</label>'' END) AS ['+CONVERT(NVARCHAR(7),@ThisDate)+']'
  SET @ThisDate=CONVERT(VARCHAR(10),dateadd(month,1,cast(@ThisDate as datetime)),120)
end

SET @StrSQL=@StrSQL+'
from vw_rtCRM_Performance AS vw_p left join tbl_rtCRM_MatchData AS tbl_m 
on vw_p.PerformanceID=tbl_m.PerformanceID  
)

SELECT * FROM dt_pager '

IF @strWhere<>''
BEGIN

  SET @StrSQL=@StrSQL+' WHERE 1=1 '+@strWhere

END

--PRINT(@StrSQL)
EXEC(@StrSQL)