SQL Server从日期范围获取天数,不包括特定日期范围内的特定天数

时间:2014-04-23 08:56:44

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2

我正在使用SQL Server 2008 R2

我在数据库中有一个表,其中包含如下所示的记录:

Id | Status   | UserId | StatusDate              | ProgramStartDate

1  | Active   |1       | 2014-04-02 00:00:00.000 | 2014-03-23
2  | Inactive |1       | 2014-04-05 00:00:00.000 | NULL
3  | Pause    |1       | 2014-04-07 00:00:00.000 | NULL
4  | Inactive |1       | 2014-04-10 00:00:00.000 | NULL
5  | Active   |1       | 2014-04-14 00:00:00.000 | NULL

ProgramStartDate是用户插入的任何日期。虽然StatusDate是用户插入/更新其状态时的实际日期时间。

现在,我想计算来自ProgramStartDate (2014-03-23) to Today's date (GETDATE())天数,不包括用户在 非活动状态的天数 状态。

此处,来自ProgramStartDate 2014-03-23 to 2014-04-05 13 天)的用户 有效 2014-04-07 to 2014-04-10 3 天)和2014-04-14 to GETDATE() 9 天) 所以活动天总数 = 13 + 3 + 9 = 25天

公式工作如下例所示:

'2014/03/23'    '2014/04/05'    13
'2014/04/05'    '2014/04/07'    -2
'2014/04/07'    '2014/04/10'    3
'2014/04/10'    '2014/04/14'    -4
'2014/04/14'    GetDate()   9

总计= 25天。

有没有办法通过SQL查询实现这个总天数?

1 个答案:

答案 0 :(得分:1)

这是您的查询的解决方案。现在试试吧。

Select SUM(TDays) SumDays
From (
Select Id, Status, UserId, 
    Case When (Status = 'Inactive') Then 0 Else
        (DATEDIFF(DAY,StatusDate,(Case When (NextDate IS NULL) Then GetDate() Else NextDate End)))
    End TDays
From (
    Select Id, Status, UserId, Case When (ProgramStartDate IS NOT NULL) Then ProgramStartDate Else StatusDate End StatusDate,
        (Select Min(StatusDate) From StatusMast M Where M.StatusDate > S.StatusDate) NextDate
    From StatusMast S
) As Stat
)As TotDay

您的输出是:

SumDays
25