【问题标题】:SQL Logic Problem & Cross Apply QuerySQL 逻辑问题和交叉应用查询
【发布时间】: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


    【解决方案1】:

    如果它应该是包容性的,请使用 =。

    我相信任何一种逻辑都有效。

    【讨论】:

    • 感谢您的信息,但这不是解决方案 :( 无论如何都赞成 :)
    【解决方案2】:

    解决方案最终是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      相关资源
      最近更新 更多