代碼: spt_values說明: 應用場景: 按月份的統計時,若某些月份無數據,統計結果就不會是月份上連續的。可以通過下麵方法得到月份連續的結果: ...
代碼:
DECLARE @startDate DATETIME = '2015-09-01' ,@endDate DATETIME = '2016-03-01' --寫法一 SELECT CONVERT(NVARCHAR(7),DATEADD(MONTH,number,@startDate),120) 年月 FROM master..spt_values WHERE TYPE = 'p' AND CONVERT(nvarchar(10),dateadd(MONTH,number,@startDate),120)<=@endDate --寫法二 SELECT CONVERT(NVARCHAR(7),DATEADD(MONTH,number,@startDate),120) 年月 FROM master..spt_values WHERE TYPE = 'p' AND number<=DATEDIFF(MONTH,@startDate,@endDate) /* 年月 ------- 2015-09 2015-10 2015-11 2015-12 2016-01 2016-02 2016-03 (7 行受影響) */
spt_values說明:
- master..spt_values是內部字典表,供SQL Server內部使用,許多系統存儲過程和函數的源代碼中都使用到了它;
- 列名分別為名稱、值、類型、下限、上限、狀態;
- 類型列的取值含義:D=Database Option P=Projection DBR=Database Role DC=Database Replication I=Index L=Locks V=Device Type
因為比較多,無法一一列舉。其中類型P較為特殊,它只是0-2047(與版本有關)之間的數字的簡單列表,作為對所有類型之間關係的預測。 - msdn查不到master..spt_values的說明,不需要太深入瞭解此表。
應用場景:
按月份的統計時,若某些月份無數據,統計結果就不會是月份上連續的。可以通過下麵方法得到月份連續的結果:
DECLARE @startDate DATETIME = '2015-09-01' ,@endDate DATETIME = '2016-03-01' SELECT B.年月,ISNULL(A.數量,0) 數量 --無數據的月份,數量設為0 FROM ( --模擬某個按月份的統考計結果,中間存在無數據的月份 SELECT '2015-09' 年月, 100 數量 UNION ALL SELECT '2015-12' 年月, 45 數量 UNION ALL SELECT '2016-02' 年月, 78 數量 ) A FULL JOIN ( --用於生成連續的月份 SELECT CONVERT(NVARCHAR(7),DATEADD(MONTH,number,@startDate),120) 年月 FROM master..spt_values WHERE TYPE = 'p' AND number<=DATEDIFF(MONTH,@startDate,@endDate) ) B ON A.年月 = B.年月 ORDER BY B.年月+'-01' /* --月份不連續的結果 年月 數量 ------- ----------- 2015-09 100 2015-12 45 2016-02 78 (3 行受影響) ------------------------------------------------------------ --月份連續的結果 年月 數量 ------- ----------- 2015-09 100 2015-10 0 2015-11 0 2015-12 45 2016-01 0 2016-02 78 2016-03 0 (7 行受影響) */