У меня есть таблица с записями в течение каждого часа подряд. Каждый час имеет некоторое значение. Я хочу, чтобы запрос T-SQL получил недостающие записи (недостающие часы, разрывы). Таким образом для DDL ниже, я должен получить запись в течение недостающего часа 01.04.2010 2:00 (предполагающий, что диапазон дат между первой и последней записью). Использование SQL Server 2005. Предпочтите основанный на наборе запрос.
DDL:
CREATE TABLE [Readings](
[StartDate] [datetime] NOT NULL,
[SomeValue] [int] NOT NULL
)
INSERT INTO [Readings]([StartDate], [SomeValue])
SELECT '20100401 00:00:00.000', 2 UNION ALL
SELECT '20100401 01:00:00.000', 3 UNION ALL
SELECT '20100401 03:00:00.000', 45
Предполагая, что все записи являются точными часами:
WITH q(s, e) AS
(
SELECT MIN(StartDate), MAX(StartDate)
FROM Readings
UNION ALL
SELECT DATEADD(hour, 1, s), e
FROM q
WHERE s < e
)
SELECT *
FROM q
WHERE s NOT IN
(
SELECT StartDate
FROM Readings
)
OPTION (MAXRECURSION 0)
Единственный способ, который я мог решить, - это создать таблицу со всеми ожидаемыми датами, а затем выполнить соединение с таблицей вы хотите проверить наличие пробелов.Вы можете создать функцию, которая принимает 2 даты, и возвращает таблицу со всеми почасовыми датами между этими двумя датами, поэтому вам не нужно создавать новую таблицу каждый раз, когда вы хотите найти все пробелы в данном периоде.
Это решение на основе набора, если у вас есть таблица со всеми датами в ней. Я не думаю, что есть способ сделать это без предварительного создания таблицы с датами, и я почти уверен, что вы не можете сделать это на основе набора.