一尘不染

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

sql

给定开始日期和结束日期,我需要计算这两个日期之间的实例数。因此,给出以下内容:

桌子:

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)如果是,哪种逻辑是正确的?(我认为这是第二个)

/讨论 :)


阅读 162

收藏
2021-03-08

共1个答案

一尘不染

解决方案最终是:

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