質問編集履歴

2

前提条件を追加。サンプルのSQLを追加

2021/05/18 03:20

投稿

yamakawa03
yamakawa03

スコア20

test CHANGED
File without changes
test CHANGED
@@ -52,10 +52,90 @@
52
52
 
53
53
  |--:|--:|--:|
54
54
 
55
- |1|1|1|2021-05-18 9:00:00|2021-05-18 17:00:00|27000秒
55
+ |1|1|1|2021-05-18 9:00:00|2021-05-18 17:00:00|27000秒|
56
56
 
57
57
  |2|1|2|2021-05-18 10:00:00|2021-05-18 11:00:00|1800秒|
58
58
 
59
59
 
60
60
 
61
+ 10:00~11:00は重なっているので、重なっている件数で割る
62
+
63
+ 1:9:00~18:00 = 8時間 = 7時間×60分×60秒 + 1時間×60分×60秒 / 3 = 26400秒
64
+
65
+ 2:10:00~11:00 = 1時間 = 1時間×60分×60秒 / 3 = 1200秒
66
+
67
+ 3:10:00~11:00 = 1時間 = 1時間×60分×60秒 / 3 = 1200秒
68
+
69
+ |id|process_id|employee_id|started_on|finished_on|working_time|
70
+
71
+ |--:|--:|--:|
72
+
73
+ |1|1|1|2021-05-18 9:00:00|2021-05-18 17:00:00|26400秒|
74
+
75
+ |2|1|2|2021-05-18 10:00:00|2021-05-18 11:00:00|1200秒|
76
+
77
+ |3|1|3|2021-05-18 10:00:00|2021-05-18 11:00:00|1200秒|
78
+
79
+
80
+
81
+ 10:00~11:00と13:00~13:30は重なっているので、重なっている件数で割る
82
+
83
+ 1:9:00~18:00 = 8時間 = 6.5時間×60分×60秒 + 1時間×60分×60秒 / 2 + 0.5時間×60分×60秒 / 2 = 26100秒
84
+
85
+ 2:10:00~11:00 = 1時間 = 1時間×60分×60秒 / 2 = 1800秒
86
+
87
+ 3:13:00~13:30 = 1時間 = 0.5時間×60分×60秒 / 2 = 900秒
88
+
89
+ |id|process_id|employee_id|started_on|finished_on|working_time|
90
+
91
+ |--:|--:|--:|
92
+
93
+ |1|1|1|2021-05-18 9:00:00|2021-05-18 17:00:00|26100秒|
94
+
95
+ |2|1|2|2021-05-18 10:00:00|2021-05-18 11:00:00|1800秒|
96
+
97
+ |3|1|3|2021-05-18 13:00:00|2021-05-18 13:30:00|900秒|
98
+
99
+
100
+
101
+ ※日付を跨ぐことはないのが前提
102
+
103
+
104
+
61
105
  これをSQLにて求めることはできますでしょうか?
106
+
107
+
108
+
109
+ 少し考えたのは以下のSQL
110
+
111
+
112
+
113
+ ```SQL
114
+
115
+ select
116
+
117
+ sum(seconds)
118
+
119
+ from
120
+
121
+ (
122
+
123
+ 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'
124
+
125
+ union all
126
+
127
+ 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'
128
+
129
+ union all
130
+
131
+ 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'
132
+
133
+ ・・・
134
+
135
+ union all
136
+
137
+ 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'
138
+
139
+ ) a
140
+
141
+ ```

1

MySQLのバージョン追記

2021/05/18 03:20

投稿

yamakawa03
yamakawa03

スコア20

test CHANGED
File without changes
test CHANGED
@@ -5,6 +5,10 @@
5
5
  * 作業時間を求めたい。
6
6
 
7
7
  * 同じ工程を複数の作業者が作業した時間は按分。
8
+
9
+
10
+
11
+ MySQL: 5.7.31
8
12
 
9
13
 
10
14