Чтобы перефразировать ваш вопрос, вы ищете вывод, который показывает, есть ли в вашей таблице дата в диапазоне (выход = 1) или нет записи (выход = 0).
Предположение : у вас будет начальная и конечная дата для вашего запроса, например, ... BETWEEN '2019-03-24' AND '2019-03-29'
Самый простой способ сделать это - «Таблица подсчета», также называемая «Таблица чисел». Это табличный объект, содержащий последовательность чисел, начиная с 0 или 1 и заканчивая тем числом, которое вам нужно. В этом примере я создам динамическую таблицу подсчета, но вы можете обнаружить, что хотите сохранить постоянную таблицу подсчета где-нибудь в вашей базе данных, чтобы вам не приходилось каждый раз создавать ее на лету.
DECLARE @startDate date = '2019-03-24'
DECLARE @endDate date = 2019-03-29
-- Get the number of days between start and end date
DECLARE @days int
SET @days = datediff (day, @StartDate, @EndDate) + 1 -- Add 1 so you have six days total
-- Build the tally table
-- NOTE: Must use SELECT...INTO to user the IDENTITY function.
-- DECLARE @Tally TABLE (N int not null primary key)
- ВСТАВИТЬ В @Tally (N)
ВЫБЕРИТЕ ТОП (@days)
IDENTITY (INT, 0,1) AS N
INTO #Tally
FROM master.sys.sysколонки sc1
CROSS JOIN master.sys.sysколонки sc2
- ПРИМЕЧАНИЕ. Существуют и другие способы создания таблицы учета. Это только один пример
- ПРИМЕЧАНИЕ. В SQL 2016 в таблице master.dbo.syscolumns содержится более 15 000 строк.
- Взаимное соединение может быть ненужным для ваших нужд. Если это так, вы можете переписать это как:
- ВСТАВЬТЕ В @Tally (N)
- ВЫБЕРИТЕ ТОП (@days)
- ИДЕНТИЧНОСТЬ (INT, 0,1) AS N
- FROM master.sys.sys колонки sc
-- Since your dynamic tally table has only the number of entries you need, no special
-- filtering on the table is needed. However, if you have too many rows, an index
-- on the N field will help. Simply use CREATE INDEX Idx1 ON #Tally(N)
;WITH Dates as (
SELECT Dateadd(day, t.N, @StartDate) As CheckDate
FROM #Tally
)
SELECT CheckDate,
CASE
WHEN EXISTS (SELECT * FROM Alarm WHERE Convert(date, Alarm_Start) = CheckDate)
Then 1
Else 0
END As Alarm_Exists
FROM Dates
ORDER BY CheckDate