Основываясь на информации, которой я поделился, я сделал следующее, что делает то, что мне нужно.
Первая часть состоит в том, чтобы найти диапазоны дат, которые отсутствуют, путем поиска дат и дат, в которых отсутствуют датымежду ними, затем вставьте их в таблицу для аудита, но она будет содержать недостающие даты, которые я ищу:
;WITH NullGaps AS(
SELECT ROW_NUMBER() OVER (ORDER BY ChannelName, ReadingDate) AS ID,SerialNumber, ReadingDate, ChannelName, uid
FROM [Staging].[UriData]
)
INSERT INTO [Staging].[MissingDates]
SELECT (DATEDIFF(MINUTE, g1.ReadingDate , g2.ReadingDate) / 15) -1 AS 'MissingCount',
g1.ChannelName,
g1.SerialNumber,
g1.ReadingDate AS FromDate,
g2.ReadingDate AS ToDate
FROM NullGaps g1
INNER JOIN NullGaps g2
ON g1.ID = (g2.ID - 1)
WHERE DATEADD(MINUTE, 15, g1.ReadingDate) < g2.ReadingDate
AND g1.ChannelName IN (SELECT ChannelName FROM staging.ActiveChannels)
AND NOT EXISTS(
SELECT 1 FROM [Staging].[MissingDates] m
WHERE m.Channel = g1.ChannelName
AND m.Serial = g1.SerialNumber
AND m.FromDate = g1.ReadingDate
AND m.ToDate = g2.ReadingDate
)
Теперь, когда у меня есть диапазоны для поиска, я теперь могу создать отсутствующие датыи вставьте их в таблицу, содержащую реальные данные.
;WITH MissingDateTime AS(
SELECT DATEADD(MINUTE, 15, FromDate) AS dte, MissingCount -1 AS MissingCount, Serial, Channel
FROM [Staging].[MissingDates]
UNION ALL
SELECT DATEADD(MINUTE, 15, dte), MissingCount - 1, Serial, Channel
FROM MissingDateTime
WHERE MissingCount > 0
) -- END CTE
INSERT INTO [Staging].[UriData]
SELECT NEWID(), Serial, Channel, '999', '0', dte, CURRENT_TIMESTAMP, 0,1,0 FROM MissingDateTime m
WHERE NOT EXISTS(
SELECT 1 FROM [Staging].[UriData] u
WHERE u.ChannelName = m.Channel
AND u.SerialNumber = m.Serial
AND u.ReadingDate = m.dte
) -- END SELECT
Я уверен, что вы можете предложить улучшения для этого.Это решение находит только пропущенные даты и позволяет мне заполнить таблицу данных только пропущенными датами.Я также могу изменить интервалы позже, если другие устройства должны использоваться для других интервалов.Я поместил запросы в два отдельных SPROC, чтобы я мог контролировать оба аспекта, а именно: один для аудита и один для обратного заполнения.