若有些月份无数据

代码:

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说明:

  1. master..spt_澳门太阳集团城网址,澳门太陽城集团登录网址,values是内部字典表,供SQL Server内部使用,比较多系统存储进程和函数的源代码中都应用到了它;
  2. 列名分别为名称、值、类型、下限、上限、状态;
  3. 项目列的取值含义:D=Database Option P=Projection DBWrangler=Database Role DC=Database Replication I=Index L=Locks V=Device Type
    若有些月份无数据。因为比很多,不能一一列举。若有些月份无数据。里面类型P较为优良,它只是0-2047(与版本有关)之间的数字的简练列表若有些月份无数据。若有些月份无数据。,作为对全体品类之间涉及的展望。
  4. 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 行受影响)
*/

 

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图