我怎样才能得到这些日期之间的时间,但根据是否分配了员工进行分组

How can I get the hours between these dates but grouped depending on whether employee assigned

我觉得这应该比我想的更容易,但是现在是这样。

我需要获取按公司 ID 分组的两个日期之间的小时数和分钟数以及开始日期的日期。然后我需要有三个单独的列;首先是该期间的总小时数。第二个是分配给员工的总小时数,第三个是未分配的总小时数。

我的 table 看起来像这样;

id company_id employee_id start_date end_date
1 25 2021-08-0907:00:00 2021-08-0915:00:00
8 25 46 2021-08-0907:00:00 2021-08-0915:00:00
15 25 141 2021-08-0907:00:00 2021-08-0915:00:00
22 25 100 2021-08-0908:00:00 2021-08-0916:00:00
29 25 80 2021-08-0908:00:00 2021-08-0916:00:00
90 1 2021-08-0904:00:00 2021-08-0910:00:00
94 1 2021-08-0904:00:00 2021-08-0911:00:00
98 1 2021-08-0904:00:00 2021-08-0918:00:00

在这里我总共有 40 个小时用于公司 25,其中 32 个小时分配给 4 名员工,8 个小时未分配。

公司1一共27小时,其中0小时分配,27小时未分配。

我最终要找的是这样的table;

company_id total_hours total_assigned total_unassigned start_date end_date
25 总共 40 小时 32 小时分配给 4 名员工 8 小时未分配 2021-08-09 2021-08-09
1 总共 27 小时 分配了 0 小时 27 小时未分配 2021-08-09 2021-08-09

我是从做这样的事情开始的;

SELECT 
    company_id, 
    CONCAT(TIME_FORMAT(SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND, start_date, end_date))), '%H hours %i minutes'), ' assigned to ', COUNT(employee_id), ' employees') as total_assigned,
    DATE(start_date) as start_date,
    DATE(end_date) as end_date,
GROUP BY 
    company_id, DATE(start_date);

这给出了总时数,但不是我需要的三个区分因素,我不确定如何更改查询以获得我需要的内容。

company_id total_assigned start_date end_date
1 27 小时 00 分钟分配给 0 名员工 2021-08-09 2021-08-09
25 40 小时 00 分钟分配给 4 名员工 2021-08-09 2021-08-09

如有任何帮助,我们将不胜感激。

不确定您使用的是什么数据库和版本,但我认为这就是您所需要的。只需添加字符串连接即可。

另一件不清楚的事情是 start_ 和 end_date 是如何计算的,所以我假设它必须是 min 和 max

select company_id, 
       sum(TIMESTAMPDIFF(HOUR, start_date, end_date)) total_hours,
       sum(case when employee_id is not null then TIMESTAMPDIFF(HOUR, start_date, end_date) else 0 end) total_assigned,
       sum(case when employee_id is null then TIMESTAMPDIFF(HOUR, start_date, end_date) else 0 end) total_unassigned,
       min(date(start_date)),
       max(date(end_date))
  from test_data td
 group by company_id