我有一个表格,其中包含日期(日期)和计数(国际)字段,如下所示。
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解决方案。
真心感谢任何帮助。
由于
答案 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