Логическая проблема SQL и перекрестный запрос

Учитывая дату начала и дату окончания, мне нужно количество экземпляров между этими двумя датами. Итак, учитывая следующее:

Таблица:

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-й)

/Обсуждать :)


person Stuart Blackler    schedule 14.06.2011    source источник


Ответы (2)


Если он должен быть инклюзивным, используйте ‹= и >=.

Я считаю либо логику с работой.

person JulieC    schedule 14.06.2011
comment
Спасибо за информацию, но это не решение :( Все равно проголосовал :) - person Stuart Blackler; 16.06.2011

В итоге получилось следующее решение:

WHERE [Date] BETWEEN Start_Date AND DATEADD(Day, -1, End_Date)
person Stuart Blackler    schedule 16.06.2011