2011-08-22 54 views
2

有一個表達式,我已經構建,以減少時間部分過時的時間,並將其置零。SQL Server重新計算還是不?

DateAdd(day, DateDiff(day, 0, PayDate), 0) 

我的問題是在此查詢(僞代碼):

select 
    DateAdd(day, DateDiff(day, 0, PayDate), 0), 
    DateAdd(day, DateDiff(day, 0, PayDate), 0) + 3 
where DateAdd(day, DateDiff(day, 0, PayDate), 0) > 3 

DateAdd表情都是一樣的。

這裏是我的問題:

  • 是否SQL服務器重新計算每次看到這種表達時間(在selectwhere子句中...)
+0

我不能聲稱完全理解你的問題,但爲什麼不嘗試看看? – Caspar

+0

我的意思是:sql是否每次重新計算這個表達式:DateAdd(day,DateDiff(day,0,PayDate),0)????? –

+0

@ Mid787:你的意思是詢問SQL Server是否重新計算查詢中每個出現的DATEADD,即使它們全都相同? –

回答

3

當你在查詢中多次使用某個函數,每次使用時都會調用它。

事實上,你用相同的參數調用它沒有任何區別。

所以是的,DATEDIFFDATEADD將被稱爲每個三次。

+0

即使是使用相同參數調用的確定性函數?似乎優化器可能會在那裏丟失一個技巧,然後呢? –

+0

我的意思是:sql是否每次重新計算這個表達式:DateAdd(day,DateDiff(day,0,PayDate),0)????? –

+0

@ Mid787:我相信,這個答案意味着回答一個明確的*是*你的問題。 –

3

您可以隨時使用:

SELECT pd, pd+3 
FROM 
    (SELECT DateAdd(day, DateDiff(day, 0, PayDate), 0) AS pd 
    FROM ... 
) 
WHERE pd > 3 

代碼看起來更優雅,你可以檢查的性能比較以前的代碼。


您還可以檢查這個(半改進):

SELECT pd, pd+3 
FROM 
    (SELECT DateAdd(day, DateDiff(day, 0, PayDate), 0) AS pd 
    FROM ... 
    WHERE DateAdd(day, DateDiff(day, 0, PayDate), 0) > 3 
) 

測試一個大表將顯示一些證據。

+1

仍然沒有得到我的具體問題的答案:是否每次計算「DateAdd(day,DateDiff(day,0,PayDate),0)」? –

+0

@ Mid787:我同意你的看法,這並不能回答你的具體問題,但是你似乎有興趣DATEADD不會被重新計算,而且這個答案至少說明了如何強有力地提示SQL Server關於你的' d喜歡它。 –

+0

@Andriy:thnx。 (到Mid787:我應該添加的是,我不知道SQL-Server優化器的細節,現在我不能測試,但用一張大表測試不同的版本(並計算所需的時間)會使您足夠證據來結束優化器內部發生的事情。) –