SQL逻辑问题&交叉应用查询

时间:2011-06-14 16:07:53

标签: sql sql-server-2005 business-logic

鉴于开始日期和结束日期,我需要在这两个日期之间计算实例数。所以给出以下内容:

表:

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月1日(01/01)和2月2日(02/01)之间寻找,我希望计数为2.如果我正在寻找第3到第4,我会期望计数为3。我正在查看整个日期范围,然后我希望数为4.有意义吗?

注意:日期已经转换为午夜,不需要为此添加任何代码。此外,在整个问题中,日期采用dd / MM / yyyy格式。

目前我的内容类似于以下内容:

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)我是否在第二个例子(以及CTE)中使用Cross Apply? 2)如果是这样,哪种逻辑是正确的? (我认为这是第二次)

/讨论:)

2 个答案:

答案 0 :(得分:3)

如果它应该是包容性的,请使用&lt; =和&gt; =。

我相信这两种逻辑都有效。

答案 1 :(得分:0)

解决方案最终成为:

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