给定开始日期和结束日期,我需要计算这两个日期之间的实例数。因此,给出以下内容:
桌子:
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
如果我在第一个(01/01)和第二个(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)? 2)如果是,哪种逻辑是正确的?(我认为这是第二个)
/讨论 :)
解决方案最终是:
WHERE [Date] BETWEEN Start_Date AND DATEADD(Day, -1, End_Date)