MySQL查询组按时间间隔的时间间隔

时间:2015-08-26 08:14:57

标签: mysql

许多员工在工作,我需要在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

1 个答案:

答案 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);