在星型架构日期 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'
我有一个日期维度 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'