Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 与日历相比,查找缺少的日期_Sql_Sql Server_Datetime - Fatal编程技术网

Sql 与日历相比,查找缺少的日期

Sql 与日历相比,查找缺少的日期,sql,sql-server,datetime,Sql,Sql Server,Datetime,我正在简要地解释这个问题 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 现在,我需要找出缺失的日期a,并与“2016”年的日历日期进行比较 i、 e.此处缺少日期“2016-11-20” 我要一份缺失日期的清单 谢谢你阅读这篇文章。祝你今天愉快。你需要生成日期,

我正在简要地解释这个问题

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  
现在,我需要找出缺失的日期a,并与“2016”年的日历日期进行比较

i、 e.此处缺少日期“2016-11-20”

我要一份缺失日期的清单


谢谢你阅读这篇文章。祝你今天愉快。

你需要生成日期,然后找到缺失的日期。递归CTE是生成少量日期的一种方法。另一种方法是使用master..spt_值作为数字列表:

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);

您需要生成日期,并且必须找到丢失的日期。下面用递归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并获取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)

不工作。第一个查询给出错误无效的日期列。下一个给我们的是。。。2016-11-23 -1@ShakeerMirza . . . 否,缺少右括号。正在获取2016年1月1日的结果。所以我编辑了上面的代码。只检查11月份。之前我发布了2016年全年