我正在使用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查询实现这个总天数?
答案 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