HAVING& BETWEEN查询返回空值

时间:2017-12-29 16:04:44

标签: mysql

示例数据

INSERT INTO `employee` (id, first_name, last_name) VALUES 
('1', 'john', 'doe'),
('2', 'joan', 'doe'),
('3', 'jeff', 'doe'),
('4', 'george', 'doe'),
('5', 'jessica', 'doe'),
('6', 'james', 'doe'),
('7', 'justin', 'doe'),
('8', 'jody', 'doe');

INSERT INTO `shift` (`started_at`, `ended_at`, `employee_id`) VALUES
('2017-11-01 08:00:00', '2017-11-01 12:00:00', 1),
('2017-11-01 12:00:00', '2017-11-01 16:00:00', 2),
('2017-11-02 08:00:00', '2017-11-02 12:00:00', 3),
('2017-12-25 12:00:00', '2017-12-25 16:00:00', 6),
('2017-12-25 12:00:00', '2017-12-25 16:00:00', 3),
('2017-12-28 19:00:00', '2017-12-28 23:00:00', 5),
('2017-12-23 12:00:00', '2017-12-23 14:00:00', 5);

预期/希望来自QUERY的结果

应显示除Jessica Doe之外的所有条目(因为她在过去两周的规则中打破了8小时)

('2017-11-01 08:00:00', '2017-11-01 12:00:00', 1),
('2017-11-01 12:00:00', '2017-11-01 16:00:00', 2),
('2017-11-02 08:00:00', '2017-11-02 12:00:00', 3),
('2017-12-25 12:00:00', '2017-12-25 16:00:00', 6),
('2017-12-25 12:00:00', '2017-12-25 16:00:00', 3),

感谢。

2 个答案:

答案 0 :(得分:0)

你必须把你的2周放在哪里?

SELECT e.first_name, e.last_name, SUM(ABS(TIMESTAMPDIFF(HOUR, s.started_at, 
s.ended_at))) as shift_hours
FROM employee e, shift s
WHERE e.id = s.employee_id and started_at BETWEEN (NOW() - INTERVAL 2 WEEK) AND NOW() 
GROUP BY e.id
HAVING shift_hours < 8

HAVING子句已添加到SQL,因为WHERE关键字不能与聚合函数一起使用。

答案 1 :(得分:0)

我可能会离开这里,MySQL不是我的专长。但是......在SQLfiddle中,如果你删除了HAVING子句(你在问题中提到的最后一行),你会发现每条记录都显示超过8小时。这意味着您的HAVING子句正常工作。它可以防止任何超过8小时的记录被退回。在这种情况下,“HAVING shift_hours&lt; 8”正在完成它应该做的事情。在我看来,你的聚合中的某些东西并没有做你想象/期望的事情。

注意:如果将逻辑比较(&lt; 8)移动到行的末尾,则会得到与删除行相同的结果。