我使用此SQL
收到“无效使用组函数”错误SELECT
SUM(overTime) AS overTimeTotal
FROM (
SELECT
SUM(IF(
SUM(TIMESTAMPDIFF(SECOND, starttid, sluttid)) >= TIME_TO_SEC('07:24:00:0000'),
SUM(TIMESTAMPDIFF(SECOND, starttid, sluttid) - TIME_TO_SEC('07:24:00:0000')),
0)) AS overTime
FROM hours
WHERE user_id = :id
AND month(starttid) = :selectedMonth) AS T
表格结构和数据:
INSERT INTO `hours` (`id`, `user_id`, `starttid`, `sluttid`) VALUES
(89, 1, '2018-05-09 05:00:00', '2018-05-09 16:00:00'),
(90, 1, '2018-05-08 05:00:00', '2018-05-08 10:00:00');
所以我正在尝试使用这个sql是为了获得总加班时间,但是当我有负加班时,如在ID 90(2:24:0000) - 它从总加班时间减去,那不是我的想。如果加时为负,我想将SUM设置为零 - 这样我才能获得实际的加班时间。在这种情况下,我期望的加班结果是: 3:36:0000,但我得到1:12:0000。所以我一直试图解决这个问题,现在我遇到了标题中描述的错误。
我该怎么做,我想要什么?
答案 0 :(得分:1)
看起来你太快聚集了。
看起来你想计算每一行的加班时间,然后进行聚合。
SELECT SUM(
IF( TIMESTAMPDIFF(SECOND, h.starttid, h.sluttid) >= TIME_TO_SEC('07:24:00:0000')
, TIMESTAMPDIFF(SECOND, h.starttid, h.sluttid) - TIME_TO_SEC('07:24:00:0000')
, 0
)
) AS overtimetotal
FROM hours h
WHERE h.user_id = :id
AND MONTH(h.startid) = :selectedMonth
进行测试时,删除聚合SUM()函数,并返回其他列
SELECT IF( TIMESTAMPDIFF(SECOND, h.starttid, h.sluttid) >= TIME_TO_SEC('07:24:00:0000')
, TIMESTAMPDIFF(SECOND, h.starttid, h.sluttid) - TIME_TO_SEC('07:24:00:0000')
, 0
) AS overtime
, GREATEST(0,
TIMESTAMPDIFF(SECOND, h.starttid, h.sluttid) - TIME_TO_SEC('07:24:00:0000')
) AS alt_overtime
, h.id
, h.starttid
, h.sluttid
FROM hours h
WHERE h.user_id = :id
AND ...
我还建议在WHERE子句的谓词中使用裸列,而不是在列上运行函数。使用文字侧的表达式返回与列数据类型匹配的datetime数据类型,例如
AND h.startid >= dt_month_begin + INTERVAL 0 MONTH
AND h.startid < dt_month_begin + INTERVAL 1 MONTH