2017-10-17 52 views
0

我有以下查詢,總和時間差我希望它將負時差設置爲零或忽略它。在MySQL SUM中實現IF時間戳差異

SELECT 
     SUM(TIMESTAMPDIFF(MINUTE, GREATEST('2017-10-16 16:00:00',created_at),LEAST('2017-10-17 00:00:00',IFNULL(closed,NOW())) 

         )) AS totalWork, created_at, closed 
     FROM cavity_actions WHERE cavity_id = 52 AND action_id = 10 AND job_id = 42 GROUP BY created_at, closed 

該查詢將返回:

totalWork created_at   closed 
-12588  2017-10-07 21:12:48 2017-10-07 22:11:08 
480   2017-10-07 22:17:45 NULL 

我需要忽略負值或將其設置爲零。

我試圖在WHERE子句中使用totalWork別名,但會生成未知列錯誤。

有什麼辦法可以設置每個TIMESTAMPDIFF()輸出的變量,然後在IF子句中使用它?

我曾嘗試:

SELECT 
     SUM(@td := TIMESTAMPDIFF(MINUTE, GREATEST('2017-10-16 16:00:00',created_at),LEAST('2017-10-17 00:00:00',IFNULL(closed,NOW())) 

         ) IF(td > 0,td,0)) AS totalWork, created_at, closed 
     FROM cavity_actions WHERE cavity_id = 52 AND action_id = 10 AND job_id = 42 GROUP BY created_at, closed 

但它返回的錯誤。

+0

使用having子句將其刪除。 totalWork> 0; –

+0

會有(SUM(TIMESTAMPDIFF(MINUTE,GREATEST('2017-10-16 16:00:00',created_at),LEAST('2017-10-17 00:00:00',IFNULL(關閉,NOW ))))))> 0'工作? – Nope

+0

@Fran擺放產生錯誤。然而,戈登解決方案似乎是完美的 – SaidbakR

回答

2

不需要IF()(或CASE,這是ANSI標準)。您可以使用GREATEST()

SELECT SUM(GREATEST(TIMESTAMPDIFF(MINUTE, 
            GREATEST('2017-10-16 16:00:00', created_at), 
            LEAST('2017-10-17 00:00:00', COALESCE(closed, NOW())) 

           ), 0 
        ) 
     ) AS totalWork, 
     created_at, closed 
FROM cavity_actions 
WHERE cavity_id = 52 AND action_id = 10 AND job_id = 42 
GROUP BY created_at, closed 
+0

但是,爲什麼是COALESCE而不是IFNULL? – SaidbakR

+1

@SaidbakR。 。 。 'COALESCE()'是所有(真實)數據庫中可用的ANSI標準功能。 –