Легко наиболее эффективный способ (на мой взгляд), как вы утверждаете, чтобы начать с таблицей всех дат. Вы должны создать это самостоятельно, и предполагая, что вы сделали, вот несколько вариантов для вас ...
SELECT
*
FROM
calendar -- Your manually created table of dates
LEFT JOIN
yourTable
ON yourTable.DateField = calendar.DateField
WHERE
yourTable.DateField IS NULL
AND calendar.DateField >= @reportFirstDate
AND calendar.DateField <= @reportLastdate
Или ...
SELECT
*
FROM
calendar -- Your manually created table of dates
WHERE
NOT EXISTS (SELECT * FROM yourTable WHERE yourTable.DateField = calendar.DateField)
AND calendar.DateField >= @reportFirstDate
AND calendar.DateField <= @reportLastdate
EDIT
Хотя он может чувствовать «неопрятный», сохраняя этот список дат, он обладает преимуществами Massive для такого типа запросов.
С таблицей дат вы просматриваете два индекса и проверяете, что существует в одном, но не другом.
Без таблицы дат у вас есть гораздо более сложный подход ...
1. Возьмите каждую запись в таблице
2. автообъединение его к следующей записи в таблице
3. Если они являются последовательными даты, отбросить их (вести учет с разрывом между ними)
4. Для каждой пары проведите через пропущенные, заполняя недостающие даты
5. С датой, отсутствующей в начале отчетного периода (без даты 1))
6. С датой, отсутствующей в конце отчетного периода (Нет даты2 в парах)
Возможно, на самом деле быстрее создать временную таблицу с датами, чтобы сделать это прямолинейно, а затем удалить таблицу снова. И если это так, почему бы вам просто не поддерживать таблицу дат?
- Просто стол на 100 лет, и забыть об этом
- Есть очень быстрые немного коды, чтобы сохранить даты до даты во все коде
Если вы не уверены, я бы рекомендовал опробовать различные варианты и убедиться в том, насколько быстрее таблица индексированных дат сравнивается с другими параметрами.
(Не говоря уже о том, как много короче, читабельности и поддержки)
Пожалуйста, пометьте свой вопрос соответствующей базой данных, не все из них ... – RedFilter
Различные базы данных, разные ответы - выберите один, хотя на SO есть множество дубликатов. –