Tsql 按顺序查找缺少的日期

Tsql 按顺序查找缺少的日期,tsql,Tsql,我很难处理这个问题,希望能得到一些帮助 我收到了一系列记录,其中包含我希望对其进行分析的信息 我如何在下面的序列中找到所有缺失的日期 文件表 丝状名称 ABC_20200101_XYZDEF_时间戳,具有相同的日期格式,但可以是更晚的日期 ABC_20200102_XYZDEF_202001030511 ABC_20200103_XYZDEF_202001030511 ABC_20200104_XYZDEF_202001040518 ABC_20200106_XYZDEF_20200106071

我很难处理这个问题,希望能得到一些帮助

我收到了一系列记录,其中包含我希望对其进行分析的信息

我如何在下面的序列中找到所有缺失的日期

文件表

丝状名称 ABC_20200101_XYZDEF_时间戳,具有相同的日期格式,但可以是更晚的日期 ABC_20200102_XYZDEF_202001030511 ABC_20200103_XYZDEF_202001030511 ABC_20200104_XYZDEF_202001040518 ABC_20200106_XYZDEF_202001060718 ABC_20200108_XYZDEF_202001080518
您可以构建一个包含范围内所有日期的日历表,然后通过子字符串进行比较,以获得不匹配的日期

DECLARE @StartDate DATE = '20200101',
        @EndDate DATE = '20200131'

DROP TABLE IF EXISTS #calendar
SELECT  CONVERT(VARCHAR(8),DATEADD(DAY, nbr - 1, @StartDate),112) as dateList
INTO #calendar
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY c.object_id ) AS Nbr
          FROM      sys.columns c
        ) nbrs
WHERE   nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate)

DROP TABLE IF EXISTS #files
CREATE TABLE #files (filenames VARCHAR(50))
INSERT INTO #files
VALUES 
('ABC_20200102_XYZDEF_202001030511'),
('ABC_20200103_XYZDEF_202001030511'),
('ABC_20200104_XYZDEF_202001040518'),
('ABC_20200106_XYZDEF_202001060718'),
('ABC_20200108_XYZDEF_202001080518')

SELECT *
FROM #calendar C
WHERE NOT EXISTS (SELECT 1 FROM #files F WHERE C.dateList = SUBSTRING(F.filenames,CHARINDEX('_',F.filenames)+1,8))

我们中的一些人可能会在您提供的示例Filnename值中查找常见日期时遇到一些困难。与其使用猜测,也许你可以更清楚地知道你认为哪些是日期,哪些可能遗漏,例如J.S.巴赫的生日。你试过什么?您遇到了什么问题?字符串中的日期格式是位置5-12谢谢您的建议,但它似乎不适合我。我总是出错。必须声明标量变量@StartDate@RookieCoder我在示例代码中添加了这些变量,以用于我的可复制示例,从而为您提供日历表的开始和结束日期。因此,如果您要复制我的代码来构建日历表,您还需要使用和声明这些变量,就像我上面所说的那样。谢谢!我会告诉你我的进展。我非常感谢逆向工程测试代码:-