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

标签 sql sql-server-2005 business-logic

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

表:

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) 我是否在第二个示例中正确使用了交叉应用(以及与此相关的 CTE)?
2)如果是这样,哪个逻辑是正确的? (我认为是第二个)

/讨论:)

最佳答案

如果它应该包含在内,请使用 <= 和 >=。

我相信这两种逻辑都适用。

关于SQL 逻辑问题和交叉应用查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6346585/

相关文章:

sql - sql server中日期时间的内部表示是什么?

ios - 你把整个应用程序的逻辑放在哪里?

javascript - 向服务/产品添加百分比的正确方法是什么?

c# - 不使用ORM的N层数据库应用程序,UI如何指定需要显示的数据?

sql - Postgres Async API 检测查询结束

php - 从php中的mysql表中选择整数值

java - 基于 DSL 的数据过滤

sql - 如何在 Excel 的 VBA 中使 ADODB.Connection 持久化?

sql - 如何实现条件Upsert存储过程?

sql - 在调试期间观察 SSIS 中的变量