2011-07-13 98 views
0

如果有人能夠幫助我處理此SQL語句,我將不勝感激。目前,我有這樣的:SQL Server:選擇SUM中兩個值之間的最小值

select sum(datediff(second, [date1], [date2])) from [MyTable] where <condition> 

但我需要完善這一選擇,即如果日期之間的差大於@MaxDiffSecs那麼@MaxDiffSecs應該用於代替總和更大。我試着看MIN運算符,但它只有一個參數,我期望至少有2個參數。

好吧,無論如何,在此先感謝。 (我想你可以告訴大家,我不是真正有效的SQL :)

+3

你看過CASE聲明嗎? – Klinger

回答

3
SELECT SUM(
    CASE WHEN DATEDIFF(second, [date1], [date2]) > @MaxDiffSecs THEN @MaxDiffSecs 
    ELSE DATEDIFF(second, [date1], [date2]) END) 
FROM [MyTable] 
WHERE <condition> 

這是從我的頭頂,不知道,如果殼體內的SUM

如果語法確實工作不工作你可以使用CTE

WITH ValuesToSum AS (
    SELECT CASE WHEN DATEDIFF(second, [date1], [date2]) > @MaxDiffSecs THEN @MaxDiffSecs 
     ELSE DATEDIFF(second, [date1], [date2]) END AS TheValue 
    FROM [MyTable] 
    WHERE <condition> 
) 

SELECT SUM(TheValue) FROM ValuesToSum 
+0

謝謝。你看我的真實例子有相當複雜的CASE WHEN語句代替[date1]和[date2]在我的示例中。所以像你所顯示的那樣在技術上將它們運行兩次。有沒有辦法做DATEDIFF一次,將結果存儲在一個變量中,然後檢查SUM運算符是否大於@MaxDiffSecs? – ahmd0

+0

@ ahmd0 - 在這種情況下很難避免執行兩次計算。您最好存儲複雜的'CASE'語句的結果,以避免重複計算一次又一次,但如果計算中使用的值頻繁更改,則需要多次更新,這可能無效。如果不知道實際的表格定義和「CASE」語句,很難說哪種方法更好。 – Tony

+0

感謝您的支持。您可以在這裏看到由ASP NET腳本生成的完整SQL語句: http://dl.dropbox.com/u/31368633/sql_query_001.txt 正如您所看到的,它不僅僅是一個像我給在這裏,雖然大部分只是一個有點重複的部分。那麼任何想法如何優化? – ahmd0

相關問題