SQLで質問です。
- 作業時間を求めたい。
- 同じ工程を複数の作業者が作業した時間は按分。
MySQL: 5.7.31
Reportsテーブル
|id|process_id|employee_id|started_on|finished_on|
|--:|--:|--:|
|1|1|1|2021-05-18 9:00:00|2021-05-18 17:00:00|
|2|1|2|2021-05-18 10:00:00|2021-05-18 11:00:00|
単純に作業時間(working_time)を求めると
9:00~18:00 = 8時間 = 8時間×60分×60秒 = 28800秒
10:00~11:00 = 1時間 = 1時間×60分×60秒 = 3600秒
|id|process_id|employee_id|started_on|finished_on|working_time|
|--:|--:|--:|
|1|1|1|2021-05-18 9:00:00|2021-05-18 17:00:00|28800秒|
|2|1|2|2021-05-18 10:00:00|2021-05-18 11:00:00|3600秒|
<<求めたい作業時間>>
10:00~11:00は重なっているので、重なっている件数で割る
9:00~18:00 = 8時間 = 7時間×60分×60秒 + 1時間×60分×60秒 / 2 = 27000秒
10:00~11:00 = 1時間 = 1時間×60分×60秒 / 2 = 1800秒
|id|process_id|employee_id|started_on|finished_on|working_time|
|--:|--:|--:|
|1|1|1|2021-05-18 9:00:00|2021-05-18 17:00:00|27000秒|
|2|1|2|2021-05-18 10:00:00|2021-05-18 11:00:00|1800秒|
10:00~11:00は重なっているので、重なっている件数で割る
1:9:00~18:00 = 8時間 = 7時間×60分×60秒 + 1時間×60分×60秒 / 3 = 26400秒
2:10:00~11:00 = 1時間 = 1時間×60分×60秒 / 3 = 1200秒
3:10:00~11:00 = 1時間 = 1時間×60分×60秒 / 3 = 1200秒
|id|process_id|employee_id|started_on|finished_on|working_time|
|--:|--:|--:|
|1|1|1|2021-05-18 9:00:00|2021-05-18 17:00:00|26400秒|
|2|1|2|2021-05-18 10:00:00|2021-05-18 11:00:00|1200秒|
|3|1|3|2021-05-18 10:00:00|2021-05-18 11:00:00|1200秒|
10:00~11:00と13:00~13:30は重なっているので、重なっている件数で割る
1:9:00~18:00 = 8時間 = 6.5時間×60分×60秒 + 1時間×60分×60秒 / 2 + 0.5時間×60分×60秒 / 2 = 26100秒
2:10:00~11:00 = 1時間 = 1時間×60分×60秒 / 2 = 1800秒
3:13:00~13:30 = 1時間 = 0.5時間×60分×60秒 / 2 = 900秒
|id|process_id|employee_id|started_on|finished_on|working_time|
|--:|--:|--:|
|1|1|1|2021-05-18 9:00:00|2021-05-18 17:00:00|26100秒|
|2|1|2|2021-05-18 10:00:00|2021-05-18 11:00:00|1800秒|
|3|1|3|2021-05-18 13:00:00|2021-05-18 13:30:00|900秒|
※日付を跨ぐことはないのが前提
これをSQLにて求めることはできますでしょうか?
少し考えたのは以下のSQL
SQL
1select 2 sum(seconds) 3from 4( 5 select 60 / count(*) as seconds from reports where process_id = 1 and started_on < '2021-05-18 9:00:00' and finished_on > '2021-05-18 9:00:00' 6 union all 7 select 60 / count(*) as seconds from reports where process_id = 1 and started_on < '2021-05-18 9:01:00' and finished_on > '2021-05-18 9:01:00' 8 union all 9 select 60 / count(*) as seconds from reports where process_id = 1 and started_on < '2021-05-18 9:02:00' and finished_on > '2021-05-18 9:02:00' 10 ・・・ 11 union all 12 select 60 / count(*) as seconds from reports where process_id = 1 and started_on < '2021-05-18 18:00:00' and finished_on > '2021-05-18 18:00:00' 13) a
回答1件
あなたの回答
tips
プレビュー