2011-08-22 49 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优化器的细节,现在我不能测试,但用一张大表测试不同的版本(并计算所需的时间)会使您足够证据来结束优化器内部发生的事情。) –