Учитывая дату начала и дату окончания, мне нужно количество экземпляров между этими двумя датами. Итак, учитывая следующее:
Таблица:
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-м (01/02), я бы ожидал, что счет будет равен 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 во втором примере (и CTE в этом отношении)?
2) Если да, то какая логика верна? (думаю, что 2-й)
/Обсуждать :)