質問するログイン新規登録

質問編集履歴

2

不正削除の修正

2016/12/05 02:57

投稿

noririn
noririn

スコア37

title CHANGED
@@ -1,1 +1,1 @@
1
- オラ
1
+ オラクル SQL 予約日重複チェックについて
body CHANGED
@@ -1,1 +1,123 @@
1
+ 現在ある予約管理システムを作成しております(MVCモデル)
2
+
3
+ 選択された予約from年月日〜予約to年月日を、
4
+ バインド変数を使用し、DBに登録されているデータと重複していないかチェックしたいと思っております。
5
+
6
+ SQLのtableは
7
+
8
+ ```SQL
9
+
10
+ CREATE TABLE RESERVE(
11
+ STARTDAY DATE,
12
+ ENDDAY DATE,
13
+ ROOMCODE CHAR(2),
14
+ PEOPLE NUMBER(2),
15
+ BASS CHAR(1),
16
+ REPRESENTATIVE VARCHAR(20),
17
+ ID CHAR(9),
18
+ PRIMARY KEY(ID),
19
+ );
20
+
21
+ ```
22
+
23
+
24
+ 上記のように作成しております。
25
+
26
+ こちらを元に、jspファイルから入力された日付の重複チェックをdaoクラスで行います。
27
+ 重複していたらCOUNTが1以上を返すようにしたいのですが、
28
+ 重複していても0を返してしまいます。
29
+
30
+ 作成したSQL文は下記です
31
+
32
+ ```SQL
33
+
34
+ String SELECT_COUNT_QUERY = "
35
+
36
+ SELECT COUNT(*) AS COUNT FROM RESERVE
37
+ WHERE ROOMCODE=?(ID)
38
+ AND ((STARTDAY <= ?(from年月日)
39
+ AND ?(from年月日) < ENDDAY)
40
+ AND (STARTDAY < ?(to年月日)
41
+ AND ?(to年月日) <= ENDDAY))
42
+
43
+ ";
44
+
45
+ ```
46
+ daoクラスで作成した重複チェックソースは下記です
47
+
48
+ ```java
49
+ public boolean isCheckOverlap(Connection con,String fromYMD,String toYMD,String roomCode) throws SQLException{
50
+
51
+ //roomCodeにはID,fromYMD,toYMDにはyyyy/mm/dd形式の年月日が入っています
52
+
53
+ //重複チェック変数
54
+ Integer overlap = null;
55
+
56
+ //判定変数
57
+ boolean flag = true;
58
+
59
+ try{
60
+
61
+ //重複チェックSQL文をプリコンパイル
62
+ PreparedStatement ps = con.preparedStatement(SELECT_COUNT_QUERY);
63
+
64
+ //バインド変数に値をセット
65
+ ps.setString(1,roomCode);
66
+ ps.setString(2,fromYMD);
67
+ ps.setString(3,fromYMD);
68
+ ps.setString(4,toYMD);
69
+ ps.setString(5,toYMD);
70
+
71
+ //セレクトの結果を受け取る
72
+ ResultSet rs = ps.executeQuery();
73
+
74
+ //最初の行を呼び出す
75
+ rs.next();
76
+
77
+ //COUNTを取得
1
- oooooooooooooooooooooooooooooooooooooooooooo
78
+ overlap = rs.getInt("COUNT");
79
+
80
+ //COUNTの結果が1以上ならfalseを返す
81
+ if(overlap >= 1){
82
+
83
+ flag = false;
84
+ }
85
+
86
+ }catch(SQLException e){
87
+ throw e;
88
+ }finally{
89
+ try{
90
+ if(rs != null)rs.close();
91
+ if(ps != null)ps.close();
92
+ }catch(SQLException e){
93
+ e.printStackTrace();
94
+ }
95
+ }
96
+ return flag;
97
+ }
98
+
99
+ ```
100
+
101
+ 上記で作成しましたが、重複したデータでもtrueになります。
102
+
103
+ SQL*PLUSに直接from年月日に'2016/08/11'、to年月日に'2016/08/14'と日付を入力するとちゃんとCOUNT数を返してくるため、
104
+
105
+ ```SQL
106
+
107
+ SELECT COUNT(*) AS COUNT FROM RESERVE
108
+ WHERE ROOMCODE=?
109
+ AND ((STARTDAY <= TO_DATE(?,'yyyy/mm/dd')
110
+ AND TO_DATE(?,'yyyy/mm/dd') < ENDDAY)
111
+ AND (STARTDAY < TO_DATE(?,'yyyy/mm/dd')
112
+ AND TO_DATE(?,'yyyy/mm/dd') <= ENDDAY));
113
+
114
+ ```
115
+
116
+ 等修正してみましたが、やはり重複していてもtrueを返してしまいます・・
117
+
118
+ SQL文から間違っていますでしょうか?
119
+
120
+
121
+ 大変お手数ですが、アドバイス頂けると幸いです。
122
+
123
+ どうぞよろしくお願い致します。

1

誤字

2016/12/05 02:57

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- オラクル SQL 予約日重複チェックについて
1
+ オラ
body CHANGED
@@ -1,123 +1,1 @@
1
- 現在ある予約管理システムを作成しております(MVCモデル)
2
-
3
- 選択された予約from年月日〜予約to年月日を、
4
- バインド変数を使用し、DBに登録されているデータと重複していないかチェックしたいと思っております。
5
-
6
- SQLのtableは
7
-
8
- ```SQL
9
-
10
- CREATE TABLE RESERVE(
11
- STARTDAY DATE,
12
- ENDDAY DATE,
13
- ROOMCODE CHAR(2),
14
- PEOPLE NUMBER(2),
15
- BASS CHAR(1),
16
- REPRESENTATIVE VARCHAR(20),
17
- ID CHAR(9),
18
- PRIMARY KEY(ID),
19
- );
20
-
21
- ```
22
-
23
-
24
- 上記のように作成しております。
25
-
26
- こちらを元に、jspファイルから入力された日付の重複チェックをdaoクラスで行います。
27
- 重複していたらCOUNTが1以上を返すようにしたいのですが、
28
- 重複していても0を返してしまいます。
29
-
30
- 作成したSQL文は下記です
31
-
32
- ```SQL
33
-
34
- String SELECT_COUNT_QUERY = "
35
-
36
- SELECT COUNT(*) AS COUNT FROM RESERVE
37
- WHERE ROOMCODE=?(ID)
38
- AND ((STARTDAY <= ?(from年月日)
39
- AND ?(from年月日) < ENDDAY)
40
- AND (STARTDAY < ?(to年月日)
41
- AND ?(to年月日) <= ENDDAY))
42
-
43
- ";
44
-
45
- ```
46
- daoクラスで作成した重複チェックソースは下記です
47
-
48
- ```java
49
- public boolean isCheckOverlap(Connection con,String fromYMD,String toYMD,String roomCode) throws SQLException{
50
-
51
- //roomCodeにはID,fromYMD,toYMDにはyyyy/mm/dd形式の年月日が入っています
52
-
53
- //重複チェック変数
54
- Integer overlap = null;
55
-
56
- //判定変数
57
- boolean flag = true;
58
-
59
- try{
60
-
61
- //重複チェックSQL文をプリコンパイル
62
- PreparedStatement ps = con.preparedStatement(SELECT_COUNT_QUERY);
63
-
64
- //バインド変数に値をセット
65
- ps.setString(1,roomCode);
66
- ps.setString(2,fromYMD);
67
- ps.setString(3,fromYMD);
68
- ps.setString(4,toYMD);
69
- ps.setString(5,toYMD);
70
-
71
- //セレクトの結果を受け取る
72
- ResultSet rs = ps.executeQuery();
73
-
74
- //最初の行を呼び出す
75
- rs.next();
76
-
77
- //COUNTを取得
78
- overlap = rs.getInt("COUNT");
1
+ oooooooooooooooooooooooooooooooooooooooooooo
79
-
80
- //COUNTの結果が1以上ならfalseを返す
81
- if(overlap >= 1){
82
-
83
- flag = false;
84
- }
85
-
86
- }catch(SQLException e){
87
- throw e;
88
- }finally{
89
- try{
90
- if(rs != null)rs.close();
91
- if(ps != null)ps.close();
92
- }catch(SQLException e){
93
- e.printStackTrace();
94
- }
95
- }
96
- return flag;
97
- }
98
-
99
- ```
100
-
101
- 上記で作成しましたが、重複したデータでもtrueになります。
102
-
103
- SQL*PLUSに直接from年月日に'2016/08/11'、to年月日に'2016/08/14'と日付を入力するとちゃんとCOUNT数を返してくるため、
104
-
105
- ```SQL
106
-
107
- SELECT COUNT(*) AS COUNT FROM RESERVE
108
- WHERE ROOMCODE=?
109
- AND ((STARTDAY <= TO_DATE(?,'yyyy/mm/dd')
110
- AND TO_DATE(?,'yyyy/mm/dd') < ENDDAY)
111
- AND (STARTDAY < TO_DATE(?,'yyyy/mm/dd')
112
- AND TO_DATE(?,'yyyy/mm/dd') <= ENDDAY));
113
-
114
- ```
115
-
116
- 等修正してみましたが、やはり重複していてもtrueを返してしまいます・・
117
-
118
- SQL文から間違っていますでしょうか?
119
-
120
-
121
- 大変お手数ですが、アドバイス頂けると幸いです。
122
-
123
- どうぞよろしくお願い致します。