回答編集履歴

7

推敲

2020/12/12 10:10

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -92,7 +92,7 @@
92
92
 
93
93
  ```
94
94
 
95
- すると以下のイメージになります。
95
+ すると以下のイメージになります。
96
96
 
97
97
  |機械番号|開始日時|終了日時|開始日|終了日|カレンダー日|稼働|
98
98
 

6

追記

2020/12/12 10:10

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -92,8 +92,24 @@
92
92
 
93
93
  ```
94
94
 
95
- ※caseで分岐してい箇所は全て1日で計算です。(TIMEDIFF等を用いて計算)
95
+ 結語すと以下イメージになります。
96
96
 
97
- `営業間外の間(17:30~19:00)は除外`部分についてさらにcaseで分割すれば良い事になります。
97
+ |機械番号|開始日|終了日|開始日|終了日|カレンダー日|稼働|
98
98
 
99
+ |:--|:--:|:--:|:--:|:--:|:--|:--:|
100
+
101
+ aaa|2020/12/4 9:00|2020/12/4 19:00|2020/12/4|2020/12/4|2020/12/4|1
102
+
103
+ bbb|2020/12/4 7:30|2020/12/7 22:00|2020/12/4|2020/12/7|2020/12/4|1
104
+
105
+ bbb|2020/12/4 7:30|2020/12/7 22:00|2020/12/4|2020/12/7|2020/12/5|0
106
+
107
+ bbb|2020/12/4 7:30|2020/12/7 22:00|2020/12/4|2020/12/7|2020/12/6|0
108
+
109
+ bbb|2020/12/4 7:30|2020/12/7 22:00|2020/12/4|2020/12/7|2020/12/7|1
110
+
111
+
112
+
113
+ 上記の行は1日の情報になるのでそれをcaseで分岐して計算すれば良いことになります。(TIMEDIFF等を用いて計算)
114
+
99
- caseだと冗長になるので、やはりfuctionにした方が良いかと思います。
115
+ `営業時間外の時間(17:30~19:00)は除外`部分についてさらにcaseで分割すれば良ですけど、やはり冗長になるので、fuctionにした方が良いかと思います。

5

推敲

2020/12/12 10:09

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -38,7 +38,9 @@
38
38
 
39
39
  2020/12/6|0
40
40
 
41
- 2020/12/7|1
41
+ 2020/12/7|1
42
+
43
+
42
44
 
43
45
  上記のテーブルとした場合のSQLの概要は以下です。
44
46
 

4

追記

2020/12/12 09:58

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -7,3 +7,91 @@
7
7
  ※FUnctionじゃなくCASEでもいけそうですね。
8
8
 
9
9
  具体的なSQLを希望されるなら、「日付から曜日を特定するテーブル」の情報も質問に追記して下さい。
10
+
11
+
12
+
13
+ 追記
14
+
15
+ --
16
+
17
+ tb_run
18
+
19
+ |機械番号|開始日時|終了日時|開始日|終了日
20
+
21
+ |:--|:--:|:--:|:--:|:--:|
22
+
23
+ aaa|2020/12/4 9:00|2020/12/4 19:00|2020/12/4|2020/12/4
24
+
25
+ bbb|2020/12/4 7:30|2020/12/7 22:00|2020/12/4|2020/12/7
26
+
27
+
28
+
29
+ tb_calender
30
+
31
+ |カレンダー日|稼働|
32
+
33
+ |:--|:--:|
34
+
35
+ 2020/12/4|1
36
+
37
+ 2020/12/5|0
38
+
39
+ 2020/12/6|0
40
+
41
+ 2020/12/7|1
42
+
43
+ 上記のテーブルとした場合のSQLの概要は以下です。
44
+
45
+ ```SQL
46
+
47
+ select run.機械番号
48
+
49
+ , sum(
50
+
51
+ case when 稼働日=1 then
52
+
53
+ case when カレンダー日=開始日 and カレンダー日=終了日 then
54
+
55
+ -- 開始日時と終了日時が日付を跨がない場合
56
+
57
+ else
58
+
59
+ case when カレンダー日=開始日 then
60
+
61
+ -- 日を跨り開始日時の計算部分
62
+
63
+ else
64
+
65
+ case when カレンダー日=終了日 then
66
+
67
+ -- 日を跨り終了日時の計算部分
68
+
69
+ else
70
+
71
+ -- 日を跨り終日稼働での計算部分
72
+
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+
79
+ end
80
+
81
+ )
82
+
83
+ from tb_run run
84
+
85
+ inner join tb_calender cld
86
+
87
+ on cld.カレンダー日 betwenn run.開始日 and run.終了日
88
+
89
+ group by run.機械番号
90
+
91
+ ```
92
+
93
+ ※caseで分岐している箇所は全て1日での計算です。(TIMEDIFF等を用いて計算)
94
+
95
+ `営業時間外の時間(17:30~19:00)は除外`部分についてさらにcaseで分割すれば良い事になります。
96
+
97
+ caseだと冗長になるので、やはりfuctionにした方が良いかと思います。

3

追記

2020/12/12 09:58

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -5,3 +5,5 @@
5
5
  「日付から曜日を特定するテーブル」と結合し、それらの情報を元に、営業時間換算するFunctionを作成するのが手っ取り早いと思います。
6
6
 
7
7
  ※FUnctionじゃなくCASEでもいけそうですね。
8
+
9
+ 具体的なSQLを希望されるなら、「日付から曜日を特定するテーブル」の情報も質問に追記して下さい。

2

追記

2020/12/12 06:33

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -3,3 +3,5 @@
3
3
 
4
4
 
5
5
  「日付から曜日を特定するテーブル」と結合し、それらの情報を元に、営業時間換算するFunctionを作成するのが手っ取り早いと思います。
6
+
7
+ ※FUnctionじゃなくCASEでもいけそうですね。

1

追記

2020/12/12 04:54

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
 
4
4
 
5
- 営業時間換算するFunctionを作成するのが手っ取り早いと思います。
5
+ 「日付から曜日を特定するテーブル」と結合し、それらの情報を元に、営業時間換算するFunctionを作成するのが手っ取り早いと思います。