我解释了问题。查找缺失的日期与日历相比
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'一比较我们的压延日期
即在此日期“二〇一六年十一月二十日 ' 不见了。
我想要缺失日期的列表。
感谢您阅读本文。祝你一天愉快。
我解释了问题。查找缺失的日期与日历相比
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'一比较我们的压延日期
即在此日期“二〇一六年十一月二十日 ' 不见了。
我想要缺失日期的列表。
感谢您阅读本文。祝你一天愉快。
你需要生成日期,你必须找到丢失的日期。下面用递归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)
您需要生成日期,然后找到丢失的日期。递归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);
联盟在您的第一个代码片段中是否都丢失了? –
无法正常工作。第一个查询给出错误无效的日期列。下一个给予输出像... 2016-11-23 \t -1 –
@ ShakeerMirza。 。 。不,封闭的圆括号不见了。 –
使用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)
谢谢。是工作。 –