我有一个类似于下面的数据表,我需要计算直到今天所有暂停时间的总和。列中可以包含任何日期,因此 PauseStart 可以是未来日期,而 PauseEnd 也可以是未来日期。空日期 (20991231) 被视为开放式结束,即未选择暂停的结束日期。
注意:日期是英国日期格式
数据
PauseID RecID PauseStart PauseEnd
1022 10 2013-01-04 15:52:04.320 2013-01-21 00:00:00.000
1023 10 2013-01-01 00:00:00.000 2013-01-02 00:00:00.000
1024 10 2013-01-05 00:00:00.000 2099-01-01 00:00:00.000
上面的数据显示,我们在 2013 年 1 月 1 日和 2013 年 2 月 1 日之间暂停,在 2013 年 4 月 1 日和 2013 年 21 月 1 日之间暂停(总和应记录为 2013 年 4 月 1 日到2013 年 7 月 1 日 11:00:00)和 2013 年 5 月 1 日 -> 开放(应在总和中登记为 2013 年 5 月 1 日至 2013 年 7 月 1 日 11:00:00)
列未编入索引。
我想出的 TSQL看起来像这样
SELECT
SUM (
CASE
WHEN NULLIF(PauseEnd,'20991231') IS NULL THEN
DATEDIFF(mi, PauseStart, ISNULL(NULLIF(PauseEnd,'20991231'), GetDate()))
WHEN PauseEnd > GetDate() THEN
DATEDIFF(mi, PauseStart, GetDate())
ELSE
DATEDIFF(mi, PauseStart, ISNULL(NULLIF(PauseEnd,'20991231'), GetDate()))
END
) AS Datedifference
FROM Pauses
WHERE Pauses.RecID = 10
AND PauseStart < GetDate()
这给了我结果
4021
1440
3533
这似乎是正确的,但是我的问题仍然存在,
这是实现这一结果的最有效方法吗?
附录,这个表可以开始保存数百万条记录,所以我想让计算总和的 tsql 在第一个实例中有效。