質問編集履歴

2

不正削除の修正

2016/12/05 02:57

投稿

noririn
noririn

スコア37

test CHANGED
@@ -1 +1 @@
1
- オラ
1
+ オラクル SQL 予約日重複チェックについて
test CHANGED
@@ -1 +1,245 @@
1
+ 現在ある予約管理システムを作成しております(MVCモデル)
2
+
3
+
4
+
5
+ 選択された予約from年月日〜予約to年月日を、
6
+
7
+ バインド変数を使用し、DBに登録されているデータと重複していないかチェックしたいと思っております。
8
+
9
+
10
+
11
+ SQLのtableは
12
+
13
+
14
+
15
+ ```SQL
16
+
17
+
18
+
19
+ CREATE TABLE RESERVE(
20
+
21
+ STARTDAY DATE,
22
+
23
+ ENDDAY DATE,
24
+
25
+ ROOMCODE CHAR(2),
26
+
27
+ PEOPLE NUMBER(2),
28
+
29
+ BASS CHAR(1),
30
+
31
+ REPRESENTATIVE VARCHAR(20),
32
+
33
+ ID CHAR(9),
34
+
35
+ PRIMARY KEY(ID),
36
+
37
+ );
38
+
39
+
40
+
41
+ ```
42
+
43
+
44
+
45
+
46
+
47
+ 上記のように作成しております。
48
+
49
+
50
+
51
+ こちらを元に、jspファイルから入力された日付の重複チェックをdaoクラスで行います。
52
+
53
+ 重複していたらCOUNTが1以上を返すようにしたいのですが、
54
+
55
+ 重複していても0を返してしまいます。
56
+
57
+
58
+
59
+ 作成したSQL文は下記です
60
+
61
+
62
+
63
+ ```SQL
64
+
65
+
66
+
67
+ String SELECT_COUNT_QUERY = "
68
+
69
+
70
+
71
+ SELECT COUNT(*) AS COUNT FROM RESERVE
72
+
73
+ WHERE ROOMCODE=?(ID)
74
+
75
+ AND ((STARTDAY <= ?(from年月日)
76
+
77
+ AND ?(from年月日) < ENDDAY)
78
+
79
+ AND (STARTDAY < ?(to年月日)
80
+
81
+ AND ?(to年月日) <= ENDDAY))
82
+
83
+
84
+
85
+ ";
86
+
87
+
88
+
89
+ ```
90
+
91
+ daoクラスで作成した重複チェックソースは下記です
92
+
93
+
94
+
95
+ ```java
96
+
97
+ public boolean isCheckOverlap(Connection con,String fromYMD,String toYMD,String roomCode) throws SQLException{
98
+
99
+
100
+
101
+ //roomCodeにはID,fromYMD,toYMDにはyyyy/mm/dd形式の年月日が入っています
102
+
103
+
104
+
105
+ //重複チェック変数
106
+
107
+ Integer overlap = null;
108
+
109
+
110
+
111
+ //判定変数
112
+
113
+ boolean flag = true;
114
+
115
+
116
+
117
+ try{
118
+
119
+
120
+
121
+ //重複チェックSQL文をプリコンパイル
122
+
123
+ PreparedStatement ps = con.preparedStatement(SELECT_COUNT_QUERY);
124
+
125
+
126
+
127
+ //バインド変数に値をセット
128
+
129
+ ps.setString(1,roomCode);
130
+
131
+ ps.setString(2,fromYMD);
132
+
133
+ ps.setString(3,fromYMD);
134
+
135
+ ps.setString(4,toYMD);
136
+
137
+ ps.setString(5,toYMD);
138
+
139
+
140
+
141
+ //セレクトの結果を受け取る
142
+
143
+ ResultSet rs = ps.executeQuery();
144
+
145
+
146
+
147
+ //最初の行を呼び出す
148
+
149
+ rs.next();
150
+
151
+
152
+
153
+ //COUNTを取得
154
+
1
- oooooooooooooooooooooooooooooooooooooooooooo
155
+ overlap = rs.getInt("COUNT");
156
+
157
+
158
+
159
+ //COUNTの結果が1以上ならfalseを返す
160
+
161
+ if(overlap >= 1){
162
+
163
+
164
+
165
+ flag = false;
166
+
167
+ }
168
+
169
+
170
+
171
+ }catch(SQLException e){
172
+
173
+ throw e;
174
+
175
+ }finally{
176
+
177
+ try{
178
+
179
+ if(rs != null)rs.close();
180
+
181
+ if(ps != null)ps.close();
182
+
183
+ }catch(SQLException e){
184
+
185
+ e.printStackTrace();
186
+
187
+ }
188
+
189
+ }
190
+
191
+ return flag;
192
+
193
+ }
194
+
195
+
196
+
197
+ ```
198
+
199
+
200
+
201
+ 上記で作成しましたが、重複したデータでもtrueになります。
202
+
203
+
204
+
205
+ SQL*PLUSに直接from年月日に'2016/08/11'、to年月日に'2016/08/14'と日付を入力するとちゃんとCOUNT数を返してくるため、
206
+
207
+
208
+
209
+ ```SQL
210
+
211
+
212
+
213
+ SELECT COUNT(*) AS COUNT FROM RESERVE
214
+
215
+ WHERE ROOMCODE=?
216
+
217
+ AND ((STARTDAY <= TO_DATE(?,'yyyy/mm/dd')
218
+
219
+ AND TO_DATE(?,'yyyy/mm/dd') < ENDDAY)
220
+
221
+ AND (STARTDAY < TO_DATE(?,'yyyy/mm/dd')
222
+
223
+ AND TO_DATE(?,'yyyy/mm/dd') <= ENDDAY));
224
+
225
+
226
+
227
+ ```
228
+
229
+
230
+
231
+ 等修正してみましたが、やはり重複していてもtrueを返してしまいます・・
232
+
233
+
234
+
235
+ SQL文から間違っていますでしょうか?
236
+
237
+
238
+
239
+
240
+
241
+ 大変お手数ですが、アドバイス頂けると幸いです。
242
+
243
+
244
+
245
+ どうぞよろしくお願い致します。

1

誤字

2016/12/05 02:57

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- オラクル SQL 予約日重複チェックについて
1
+ オラ
test CHANGED
@@ -1,245 +1 @@
1
- 現在ある予約管理システムを作成しております(MVCモデル)
2
-
3
-
4
-
5
- 選択された予約from年月日〜予約to年月日を、
6
-
7
- バインド変数を使用し、DBに登録されているデータと重複していないかチェックしたいと思っております。
8
-
9
-
10
-
11
- SQLのtableは
12
-
13
-
14
-
15
- ```SQL
16
-
17
-
18
-
19
- CREATE TABLE RESERVE(
20
-
21
- STARTDAY DATE,
22
-
23
- ENDDAY DATE,
24
-
25
- ROOMCODE CHAR(2),
26
-
27
- PEOPLE NUMBER(2),
28
-
29
- BASS CHAR(1),
30
-
31
- REPRESENTATIVE VARCHAR(20),
32
-
33
- ID CHAR(9),
34
-
35
- PRIMARY KEY(ID),
36
-
37
- );
38
-
39
-
40
-
41
- ```
42
-
43
-
44
-
45
-
46
-
47
- 上記のように作成しております。
48
-
49
-
50
-
51
- こちらを元に、jspファイルから入力された日付の重複チェックをdaoクラスで行います。
52
-
53
- 重複していたらCOUNTが1以上を返すようにしたいのですが、
54
-
55
- 重複していても0を返してしまいます。
56
-
57
-
58
-
59
- 作成したSQL文は下記です
60
-
61
-
62
-
63
- ```SQL
64
-
65
-
66
-
67
- String SELECT_COUNT_QUERY = "
68
-
69
-
70
-
71
- SELECT COUNT(*) AS COUNT FROM RESERVE
72
-
73
- WHERE ROOMCODE=?(ID)
74
-
75
- AND ((STARTDAY <= ?(from年月日)
76
-
77
- AND ?(from年月日) < ENDDAY)
78
-
79
- AND (STARTDAY < ?(to年月日)
80
-
81
- AND ?(to年月日) <= ENDDAY))
82
-
83
-
84
-
85
- ";
86
-
87
-
88
-
89
- ```
90
-
91
- daoクラスで作成した重複チェックソースは下記です
92
-
93
-
94
-
95
- ```java
96
-
97
- public boolean isCheckOverlap(Connection con,String fromYMD,String toYMD,String roomCode) throws SQLException{
98
-
99
-
100
-
101
- //roomCodeにはID,fromYMD,toYMDにはyyyy/mm/dd形式の年月日が入っています
102
-
103
-
104
-
105
- //重複チェック変数
106
-
107
- Integer overlap = null;
108
-
109
-
110
-
111
- //判定変数
112
-
113
- boolean flag = true;
114
-
115
-
116
-
117
- try{
118
-
119
-
120
-
121
- //重複チェックSQL文をプリコンパイル
122
-
123
- PreparedStatement ps = con.preparedStatement(SELECT_COUNT_QUERY);
124
-
125
-
126
-
127
- //バインド変数に値をセット
128
-
129
- ps.setString(1,roomCode);
130
-
131
- ps.setString(2,fromYMD);
132
-
133
- ps.setString(3,fromYMD);
134
-
135
- ps.setString(4,toYMD);
136
-
137
- ps.setString(5,toYMD);
138
-
139
-
140
-
141
- //セレクトの結果を受け取る
142
-
143
- ResultSet rs = ps.executeQuery();
144
-
145
-
146
-
147
- //最初の行を呼び出す
148
-
149
- rs.next();
150
-
151
-
152
-
153
- //COUNTを取得
154
-
155
- overlap = rs.getInt("COUNT");
1
+ oooooooooooooooooooooooooooooooooooooooooooo
156
-
157
-
158
-
159
- //COUNTの結果が1以上ならfalseを返す
160
-
161
- if(overlap >= 1){
162
-
163
-
164
-
165
- flag = false;
166
-
167
- }
168
-
169
-
170
-
171
- }catch(SQLException e){
172
-
173
- throw e;
174
-
175
- }finally{
176
-
177
- try{
178
-
179
- if(rs != null)rs.close();
180
-
181
- if(ps != null)ps.close();
182
-
183
- }catch(SQLException e){
184
-
185
- e.printStackTrace();
186
-
187
- }
188
-
189
- }
190
-
191
- return flag;
192
-
193
- }
194
-
195
-
196
-
197
- ```
198
-
199
-
200
-
201
- 上記で作成しましたが、重複したデータでもtrueになります。
202
-
203
-
204
-
205
- SQL*PLUSに直接from年月日に'2016/08/11'、to年月日に'2016/08/14'と日付を入力するとちゃんとCOUNT数を返してくるため、
206
-
207
-
208
-
209
- ```SQL
210
-
211
-
212
-
213
- SELECT COUNT(*) AS COUNT FROM RESERVE
214
-
215
- WHERE ROOMCODE=?
216
-
217
- AND ((STARTDAY <= TO_DATE(?,'yyyy/mm/dd')
218
-
219
- AND TO_DATE(?,'yyyy/mm/dd') < ENDDAY)
220
-
221
- AND (STARTDAY < TO_DATE(?,'yyyy/mm/dd')
222
-
223
- AND TO_DATE(?,'yyyy/mm/dd') <= ENDDAY));
224
-
225
-
226
-
227
- ```
228
-
229
-
230
-
231
- 等修正してみましたが、やはり重複していてもtrueを返してしまいます・・
232
-
233
-
234
-
235
- SQL文から間違っていますでしょうか?
236
-
237
-
238
-
239
-
240
-
241
- 大変お手数ですが、アドバイス頂けると幸いです。
242
-
243
-
244
-
245
- どうぞよろしくお願い致します。