我怎样才能得到这些日期之间的时间,但根据是否分配了员工进行分组
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
我觉得这应该比我想的更容易,但是现在是这样。
我需要获取按公司 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