许多员工在工作,我需要在1小时的间隔内找出工作的员工人数。员工的工作时间表不同。部分工作时间为08:00-16:00,部分时间为07:00-15:00,部分时间为10:00-22:00。我需要一份报告,以便在1小时内显示no_of_employees工作。
Hours 08::00- 09:00 No_of_employees working 12,
Hours 09:00-10:00 No_of_employees working 13,
Hours 10:00-11:00 No_of_employees working 14,
etc
我意识到错误的间隔时间越短。我使用了下面的代码但没有成功。
SELECT date-time_from, date-time_to, COUNT(*),
DATE(DATE_SUB(date-time_from, INTERVAL 1 HOUR))
FROM `employee_roster`
WHERE `work_status` = 'WORK'
GROUP BY DATE(DATE_SUB(date-time_from, INTERVAL 1 HOUR))
请根据您的要求找到表格的抽象结构。
TABLE `employee_roster` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`employee_id` int(10) NOT NULL,
`date-time_from` datetime NOT NULL,
`date-time_to` datetime NOT NULL,
`work_status` var-char(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Date-time_from和Date-time_to是构成工作时间(期间)的两个日期时间字段,即2015/0101 06:00 - 2015/01/01 18:30
请参阅下面的输出。
DatetimeFrom DatetimeTo no_of_employee
2015-01-05 01:00:00 2015-01-05 02:00:00 168
2015-01-05 06:00:00 2015-01-05 07:00:00 84
2015-01-05 07:00:00 2015-01-05 08:00:00 84
2015-01-05 07:20:00 2015-01-05 08:20:00 42
2015-01-05 19:00:00 2015-01-05 20:00:00 42
2015-01-05 19:20:00 2015-01-05 20:20:00 84
2015-01-06 01:00:00 2015-01-06 02:00:00 126
2015-01-06 06:00:00 2015-01-06 07:00:00 42
2015-01-06 07:00:00 2015-01-06 08:00:00 42
2015-01-06 07:20:00 2015-01-06 08:20:00 42
奇怪的是,即使我有24个小时的工作时间,它仍然坚持开始上映时间,即07:00,08:00。在我看来,我用1替换来运行查询的I变量使条件仅对第一条记录有效。如何在SQL查询中增加变量i
?
答案 0 :(得分:1)
有很多方法可以解决这个问题,您可能希望调整此处提供的查询。
这个答案应该指向正确的方向。
首先,您需要一个包含每个可能工作时间的帮助表(我假设不超过12小时,但可以随意调整)
create table hours (i int unsigned not null);
insert into hours(i) values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12);
然后,使用此表,您需要扩展原始表,以便为每个用户的每个工作小时获得一行。最后,您希望按每个1小时的间隔进行分组。这样的事情(再次,随意适应,特别是如果你想删除"日期"部分只保留时间):
SELECT DATE_ADD(datetime_from, INTERVAL i HOUR) AS start, DATE_ADD(datetime_from, INTERVAL i+1 HOUR) as end, COUNT(employee_id)
FROM employee_roster
JOIN hours ON i <= TIMESTAMPDIFF(HOUR, datetime_from, datetime_to)
GROUP BY CONCAT(start,end);