在星型架构日期 table 中查找缺失的日期

Find missing dates in Star Schema date table

我有一个日期维度 table。它从 1900-01-01 开始,包括一天,直到 2199-12-31 为止的每一天。我需要找到它错过了任何日期。

我已经尝试了互联网上的大部分查询。我的 sql 理解不足以分解查询来理解。另外,我没有写 temp tables(正在处理它)的权限,所以这阻碍了一些。

这是我试过的一个。我的列名称是 ShortDate。还有一个 longdate 列,我尝试进行比较但没有成功。 table 名称是 dimDate。

   {
    SELECT t1.ShortDate AS startOfGap, MIN(t2.ShortDate) AS endOfGap  
       FROM  
       (SELECT ShortDate = ShortDate + 1  FROM sampleDates tbl1  
          WHERE NOT EXISTS(SELECT * FROM dimDates tbl2  
                          WHERE tbl2.ShortDate = tbl1.ShortDate + 1) 
          AND ShortDate <> (SELECT MAX(ShortDate) FROM dimDates)) 
    t1 
       INNER JOIN  
       (SELECT ShortDate = ShortDate – 1  FROM dimDates tbl1  
          WHERE NOT EXISTS(SELECT * FROM dimDates tbl2  
                              WHERE tbl1.theDate = tbl2.theDate + 1) 
              AND ShortDate <> (SELECT MIN(ShortDate) FROM dimDates)) t2  
           ON t1.ShortDate <= t2.ShortDate 
           GROUP BY t1.ShortDate;
        }

我每次尝试查询时都会遇到大量错误。不幸的是,我的逻辑不够好,无法理解这个查询中应该包含什么

我试过这个:

SELECT  TOP 1
        DateShort + 1
FROM   dimDates mo
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    dimDates mi 
        WHERE   mi.DateShort = mo.DateShort + 1
        )
ORDER BY DateShort

但收到一条错误消息,指出“将 nvarchar 值‘2029-10-02’转换为数据类型 int 时转换失败

自连接可以与 datediff 结合使用,以识别缺少天数的间隙。你会明白的。

 declare @test table (yourdate datetime);
 insert into @test
 values 
 ('2019-01-01'),
 ('2019-01-02'),
 ('2019-01-03'),
 ('2019-01-04'),
 ('2019-01-05'),
 ('2019-01-07')

 select t1.yourdate [firstdate], t2.yourdate [next date], 
 case when datediff(d,t1.yourdate,t2.yourdate) > 1 then 'flag' else 'ok' end [dayflag]
 from
 (
 select yourdate, row_number() over (order by yourdate) seq
 from @test
 )t1
 left join (select yourdate, row_number() over (order by yourdate) seq from @test) t2
 ON t1.seq = t2.seq - 1

只需使用lead():

select sd.*
from (select sd.*, lead(shortdate) over (order by shortdate) as next_shortdate
      from sampleDates sd
     ) sd
where next_shortdate <> dateadd(day, 1, shortdate);

这不会 return 字符串期末的缺失日期。您可以使用以下方法解决此问题:

where next_shortdate <> dateadd(day, 1, shortdate) or
      (next_shortdate is null and shortdate < '2199-12-31'

您也可以使用 join:

select sd.*  -- the day before each group of missing dates
from sampleDates sd left join
     sampleDate sd_next
     on sd_next.shortdate = dateadd(day, 1, shortdate)
where sd_next.shortdate is null;

此版本将 return 最后日期 table,因此您可能要添加:

where sd.shortdate <  '2199-12-31'