Учитывая дату начала и дату окончания, мне нужно количество экземпляров между этими двумя датами.Итак, учитывая следующее:
Таблица:
Col 1 Start_Date End_Date
1 01/01/2010 02/01/2010
2 01/01/2010 04/01/2010
3 03/01/2010 04/01/2010
4 03/01/2010 04/01/2010
Если бы я смотрел между 1-м (01/01) и 2-м (02/01), я бы ожидал счет 2.Если бы я искал с 3-го по 4-е, я бы ожидал счет 3. Если бы я искал весь диапазон дат, то я бы ожидал счет 4. Имеет смысл?
ПРИМЕЧАНИЕ: Даты уже конвертированы в полночь, для этого не нужно добавлять код.Кроме того, даты в этом вопросе представлены в формате дд / мм / гггг.
В настоящее время у меня есть нечто похожее на следующее:
SELECT COUNT(*), Group_Field
FROM MY_Table
WHERE Start_Date < DATEADD(DAY, 1, @StartDate) AND End_Date > @EndDate
GROUP BY Group_Field
В какой-то момент я подумал, что это правильно,но сейчас я не уверен ...
У меня раньше было:
WITH Dates AS (
SELECT [Date] = @StartDate
UNION ALL SELECT [Date] = DATEADD(DAY, 1, [Date])
FROM Dates WHERE [Date] < @EndDate
)
SELECT COUNT(*), Group_Field -- In this case it is [Date]
FROM MY_Table
CROSS APPLY Dates
WHERE Start_Date < DATEADD(DAY, 1, @StartDate) AND End_Date > [Date]
GROUP BY Group_Field
Но я не уверен, что в этом случае я правильно использую CROSS APPLY ...
Вопросы:
1) Использую ли я Cross Apply прямо во 2-м примере (и CTE в этом отношении)?
2) Если да, то какая логика верна?(Я думаю, что это 2-й)
/ Обсудить:)