2016-11-25 43 views
2

我解释了问题。查找缺失的日期与日历相比

select distinct DATE from #Table where DATE >='2016-01-01' 

输出:

Date 
2016-11-23 
2016-11-22 
2016-11-21 
2016-11-19 
2016-11-18 

现在我需要找出失踪的日期从今年的2016'一比较我们的压延日期

即在此日期“二〇一六年十一月二十日 ' 不见了。

我想要缺失日期的列表。

感谢您阅读本文。祝你一天愉快。

回答

2

你需要生成日期,你必须找到丢失的日期。下面用递归CTE我已经做到了

;WITH CTE AS 
    (
    SELECT CONVERT(DATE,'2016-01-01') AS DATE1 
    UNION ALL 
    SELECT DATEADD(DD,1,DATE1) FROM CTE WHERE DATE1<'2016-12-31' 
    ) 
    SELECT DATE1 MISSING_ONE FROM CTE 
    EXCEPT 
    SELECT * FROM #TABLE1 
    option(maxrecursion 0) 
+2

谢谢。是工作。 –

1

您需要生成日期,然后找到丢失的日期。递归CTE是产生少量日期的一种方法。另一种方法是使用master..spt_values作为号码的清单:

with n as (
     select row_number() over (order by (select null)) - 1 as n 
     from master..spt_values 
    ), 
    d as (
     select dateadd(day, n.n, cast('2016-01-01' as date)) as dte 
     from n 
     where n <= 365 
    ) 
select d.date 
from d left join 
    #table t 
    on d.dte = t.date 
where t.date is null; 

如果你是范围失踪日期开心就好,你不需要日期列表都:

select date, (datediff(day, date, next_date) - 1) as num_missing 
from (select t.*, lead(t.date) over (order by t.date) as next_date 
     from #table t 
     where t.date >= '2016-01-01' 
    ) t 
where next_date <> dateadd(day, 1, date); 
+0

联盟在您的第一个代码片段中是否都丢失了? –

+0

无法正常工作。第一个查询给出错误无效的日期列。下一个给予输出像... 2016-11-23 \t -1 –

+0

@ ShakeerMirza。 。 。不,封闭的圆括号不见了。 –

1

使用CTE并获得CTE表中的所有日期,然后用你的表进行比较。

CREATE TABLE #yourTable(_Values DATE) 
INSERT INTO #yourTable(_Values) 
SELECT '2016-11-23' UNION ALL 
SELECT '2016-11-22' UNION ALL 
SELECT '2016-11-21' UNION ALL 
SELECT '2016-11-19' UNION ALL 
SELECT '2016-11-18' 


DECLARE @DATE DATE = '2016-11-01' 
;WITH CTEYear (_Date) AS 
(
    SELECT @DATE 
    UNION ALL 
    SELECT DATEADD(DAY,1,_Date) 
    FROM CTEYear 
    WHERE _Date < EOMONTH(@DATE,0) 
) 

SELECT * FROM CTEYear 
WHERE NOT EXISTS(SELECT 1 FROM #yourTable WHERE _Date = _Values) 
OPTION(maxrecursion 0) 
+0

无法正常工作。用样品数据检查plz检查 –

+0

你得到了什么结果或错误..? – Mansoor

+0

从01/01/2016获取结果。等 –