查找日期列表中是否缺少日期,如果是,则将其添加到列表中

时间:2014-11-30 15:56:00

标签: sql azure-sql-database

我有一个表格,其中包含日期(日期)和计数(国际)字段,如下所示。

13-09-2013     100
14-09-2013     200
16-09-2013     100
17-09-2013     100
20-09-2013     200
/** and so on **/

我需要做的是找到日期列中第一个和最后一个日期之间的所有缺失日期,并将它们插入到计数为“0”的表中。

我找到了一种方法this using C# and linq,但我更愿意找到一个sql解决方案。

真心感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:0)

使用Recursive CTE生成最短和最长日期之间的日期列表。

DECLARE @mindate DATE =(SELECT Min(CONVERT(DATE, '13-09-2013', 105))
          FROM   tablename),
        @maxdate DATE =(SELECT Max(CONVERT(DATE, '13-09-2013', 105))
          FROM   tablename);

WITH cte
     AS (SELECT @mindate AS dates
         UNION ALL
         SELECT Dateadd(Day, 1, dates)
         FROM   cte
         WHERE  dates < @maxdate)
SELECT a.dates,
       Isnull([count], 0)
FROM   cte a
       LEFT JOIN tablename b
              ON b.[date] = a.dates 

答案 1 :(得分:0)

create table mytab(mdate date,cnt int)

insert into mytab
select '2013-09-13'    ,  100 union all
select '2013-09-14'  ,   200 union all
select '2013-09-16' ,    100 union all
select '2013-09-17',     100 union all
select '2013-09-17',     200

使用递归CTE

尝试此操作
with
 cte
 as
 (
 select n=CAST('2013-09-13' as DATe)  
 union all
 select DATEADD(dd,1,CTE.n) from CTE
   where n<='2013-09-18'
 )
 select n,ISNULL(cnt,0) from CTE
 LEFT JOIN mytab
 on mdate=CTE.n

<强>输出

mDate       cnt
2013-09-13  100
2013-09-14  200
2013-09-15  0
2013-09-16  100
2013-09-17  100
2013-09-17  200
2013-09-18  0
2013-09-19  0