2011-07-13 56 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

相关问题