如何解决SQL 查找范围之间的缺失日期
我有一张针对不同源系统运行的作业表。它们有一个“RunDate”,然后是 FromDate
和 ToDate
。
我想找出 FromDate
和 ToDate
字段中缺少任何日期的差距,以确保我们已经涵盖了这些时期的数据。
我看过许多示例,其中单个日期在单列范围中丢失,但是我有一个 From 和 To 范围,我需要测试并最终找出可能丢失日期的位置。
CREATE TABLE #temptable ( [SourceSystem] nchar(3),[RunDate] datetime,[ResubmitCount] int,[FromDate] date,[ToDate] date )
INSERT INTO #temptable
VALUES
( N'ILG',N'2021-07-28T15:35:23.207',N'2021-06-01T00:00:00',N'2021-06-01T00:00:00' ),( N'ILG',N'2021-07-28T15:35:23.707',N'2021-06-05T00:00:00',N'2021-06-06T00:00:00' ),( N'AAP',N'2021-07-28T15:35:23.833',N'2021-06-02T00:00:00' ),N'2021-06-04T00:00:00',N'2021-06-04T00:00:00' ),( N'ZZP',N'2021-07-28T15:35:23.897',N'2021-06-05T00:00:00' )
DROP TABLE #temptable
很明显,使用上面的示例,我应该能够确定 SourceSystem 2021-06-02
和 2021-06-04
到 ILG
的 2021-06-03
和 2021-06-03
之间的时间段缺少 SourceSystem AAP
。
努力使其适用于范围,我可以处理单个日期,但系统不会在这种情况下记录它们。
更新
我接受了接受的答案,然后在其中标记了一些代码,以便能够分解指定范围之间的所有单个日期。
包含代码,以防将来有人需要。
WITH
a AS (
SELECT
SourceSystem,FromDate,ToDate,LEAD(FromDate) OVER(
PARTITION BY SourceSystem
ORDER BY RunDate
) AS NextDate
FROM dbo.WDSubmission ws
),gap_periods AS
(
SELECT
SourceSystem,DATEADD(DAY,1,ToDate) AS GapBeg,-1,NextDate) AS GapFin
FROM a
WHERE
NextDate IS NOT NULL AND
DATEADD(DAY,-2,NextDate) >= ToDate
--AND a.sourceSystem = 'OGI'
),E00(N) AS (SELECT 1 UNION ALL SELECT 1),E02(N) AS (SELECT 1 FROM E00 a,E00 b),E04(N) AS (SELECT 1 FROM E02 a,E02 b),E08(N) AS (SELECT 1 FROM E04 a,E04 b),E16(N) AS (SELECT 1 FROM E08 a,E08 b),E32(N) AS (SELECT 1 FROM E16 a,E16 b),cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E32),Daterange AS
(
SELECT ExplodedDate = DATEADD(DAY,N - 1,'2021-01-01')
FROM cteTally
WHERE N <= DATEDIFF(DAY,'2021-01-01',GETDATE())
)
SELECT *
FROM gap_periods eh
JOIN Daterange d ON d.ExplodedDate >= eh.GapBeg
AND d.ExplodedDate <= eh.GapFin;
解决方法
试试这个:
WITH
a AS (
SELECT
SourceSystem,FromDate,ToDate,LEAD(FromDate) OVER(
PARTITION BY SourceSystem
ORDER BY RunDate
) AS NextDate
FROM #temptable
)
SELECT
SourceSystem,DATEADD(DAY,1,ToDate) AS GapBeg,-1,NextDate) AS GapFin
FROM a
WHERE
NextDate IS NOT NULL AND
DATEADD(DAY,-2,NextDate) >= ToDate;
结果:
+--------------+------------+------------+
| SourceSystem | GapBeg | GapFin |
+--------------+------------+------------+
| AAP | 2021-06-03 | 2021-06-03 |
| ILG | 2021-06-02 | 2021-06-04 |
+--------------+------------+------------+
,
很难显示丢失的日期,而且分析的信息太多。但是您可以使用以下查询获得跳过的天数:
select *,datediff(day,lag(ToDate)over(partition by sourcesystem order by ToDate),fromdate) from #temptable
数据看起来像这样(最后一列表示跳过的天数):
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。