鉴于开始日期和结束日期,我需要在这两个日期之间计算实例数。所以给出以下内容:
表:
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)如果是这样,哪种逻辑是正确的? (我认为这是第二次)
/讨论:)
答案 0 :(得分:3)
如果它应该是包容性的,请使用&lt; =和&gt; =。
我相信这两种逻辑都有效。
答案 1 :(得分:0)
解决方案最终成为:
WHERE [Date] BETWEEN Start_Date AND DATEADD(Day, -1, End_Date)