2013-01-07 171 views
0

我有一個類似於下面的數據表,我需要計算所有暫停時間的總和,直到今天。列中可以包含任何日期,所以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在第一個實例中計算總和效率。

+0

我不認爲這有什麼性能差異,但在你的case語句'第一行當NULLIF(PauseEnd,「20991231」)IS NULL THEN'我認爲它更具可讀性,當'暫停='20991231'那麼'時。次要的東西,我知道;-) – Bridge

回答

2

我會做這樣的:

SELECT 
PauseStart, 
DATEDIFF(mi, PauseStart, CASE WHEN PauseEnd > GetDate() THEN GetDate() ELSE PauseEnd END) as Datedifference 
FROM Pauses 
WHERE Pauses.RecID = 10 AND PauseStart < GetDate() 
+0

有趣的是,我明顯錯過了null(20991231)總是會更大,然後GetDate() – kolin

+0

很好,無論如何,我希望我們已經演變超越TSQL。 – kolin

+0

對不起,我沒有考慮它可以爲空 – erichste

相關問題