在MySQL和时间戳差异中实现IF
我有以下查询,求和时差,我希望它将负时差设置为零或忽略它在MySQL和时间戳差异中实现IF,mysql,sql,Mysql,Sql,我有以下查询,求和时差,我希望它将负时差设置为零或忽略它 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_acti
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
但是它返回错误。不需要IF()
(或者CASE
,这是ANSI标准)。您可以使用greest()
:
不需要IF()
(或CASE
,这是ANSI标准)。您可以使用greest()
:
使用having子句删除它。总功>0;
SUM(TIMESTAMPDIFF(MINUTE,maxist('2017-10-16 16:00:00',created_至少,'2017-10-17 00:00:00',IFNULL(closed,NOW()))>0
work?@Fran生成错误。然而,Gordon的解决方案似乎是完美的,因为它使用子句来删除它。总功>0;SUM(TIMESTAMPDIFF(MINUTE,maxist('2017-10-16 16:00:00',created_至少,'2017-10-17 00:00:00',IFNULL(closed,NOW()))>0
work?@Fran生成错误。然而,Gordon解决方案似乎是完美的,但为什么是COALESCE而不是IFNULL?@SaidbakRCOALESCE()
是所有(真实)数据库中可用的ANSI标准功能。但为什么COALESCE而不是IFNULL?@SaidbakRCOALESCE()
是所有(真实)数据库中可用的ANSI标准功能。
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