【发布时间】:2011-09-14 20:26:31
【问题描述】:
给定开始日期和结束日期,我需要计算这两个日期之间的实例数。所以给出以下内容:
表:
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。有意义吗?
注意:日期已转换为午夜,无需为此添加代码。此外,整个问题中的日期均采用 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) 我是否在第二个示例中使用了 Cross Apply(以及 CTE)?
2)如果是这样,哪个逻辑是正确的? (我认为是第二个)
/讨论:)
【问题讨论】:
标签: sql sql-server-2005 business-logic