Проблема логики SQL и перекрестный запрос - PullRequest
3 голосов
/ 14 июня 2011

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

Таблица:

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

/ Обсудить:)

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

Если предполагается, что оно включено, используйте <= и> =.

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

0 голосов
/ 16 июня 2011

Решение оказалось:

WHERE [Date] BETWEEN Start_Date AND DATEADD(Day, -1, End_Date)
...