我有一個類似於下面的數據表,我需要計算所有暫停時間的總和,直到今天。列中可以包含任何日期,所以PauseStart可以是未來日期,PauseEnd也可以是未來日期。空的日期(20991231)被認爲是開放式的,即沒有選擇暫停的結束日期。這是做這個TSQL計算的最有效方法嗎?
注:日期是英國的日期格式
數據
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年1月21日(註冊時間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在第一個實例中計算總和效率。
我不認爲這有什麼性能差異,但在你的case語句'第一行當NULLIF(PauseEnd,「20991231」)IS NULL THEN'我認爲它更具可讀性,當'暫停='20991231'那麼'時。次要的東西,我知道;-) – Bridge