現在ある予約管理システムを作成しております(MVCモデル)
選択された予約from年月日〜予約to年月日を、
バインド変数を使用し、DBに登録されているデータと重複していないかチェックしたいと思っております。
SQLのtableは
SQL
1 2CREATE TABLE RESERVE( 3STARTDAY DATE, 4ENDDAY DATE, 5ROOMCODE CHAR(2), 6PEOPLE NUMBER(2), 7BASS CHAR(1), 8REPRESENTATIVE VARCHAR(20), 9ID CHAR(9), 10PRIMARY KEY(ID), 11); 12
上記のように作成しております。
こちらを元に、jspファイルから入力された日付の重複チェックをdaoクラスで行います。
重複していたらCOUNTが1以上を返すようにしたいのですが、
重複していても0を返してしまいます。
作成したSQL文は下記です
SQL
1 2String SELECT_COUNT_QUERY = " 3 4SELECT COUNT(*) AS COUNT FROM RESERVE 5WHERE ROOMCODE=?(ID) 6AND ((STARTDAY <= ?(from年月日) 7AND ?(from年月日) < ENDDAY) 8AND (STARTDAY < ?(to年月日) 9AND ?(to年月日) <= ENDDAY)) 10 11"; 12
daoクラスで作成した重複チェックソースは下記です
java
1public boolean isCheckOverlap(Connection con,String fromYMD,String toYMD,String roomCode) throws SQLException{ 2 3 //roomCodeにはID,fromYMD,toYMDにはyyyy/mm/dd形式の年月日が入っています 4 5 //重複チェック変数 6 Integer overlap = null; 7 8 //判定変数 9 boolean flag = true; 10 11try{ 12 13 //重複チェックSQL文をプリコンパイル 14 PreparedStatement ps = con.preparedStatement(SELECT_COUNT_QUERY); 15 16 //バインド変数に値をセット 17 ps.setString(1,roomCode); 18 ps.setString(2,fromYMD); 19 ps.setString(3,fromYMD); 20 ps.setString(4,toYMD); 21 ps.setString(5,toYMD); 22 23 //セレクトの結果を受け取る 24 ResultSet rs = ps.executeQuery(); 25 26 //最初の行を呼び出す 27 rs.next(); 28 29 //COUNTを取得 30 overlap = rs.getInt("COUNT"); 31 32 //COUNTの結果が1以上ならfalseを返す 33 if(overlap >= 1){ 34 35 flag = false; 36 } 37 38}catch(SQLException e){ 39 throw e; 40}finally{ 41 try{ 42 if(rs != null)rs.close(); 43 if(ps != null)ps.close(); 44 }catch(SQLException e){ 45 e.printStackTrace(); 46 } 47} 48return flag; 49} 50
上記で作成しましたが、重複したデータでもtrueになります。
SQL*PLUSに直接from年月日に'2016/08/11'、to年月日に'2016/08/14'と日付を入力するとちゃんとCOUNT数を返してくるため、
SQL
1 2SELECT COUNT(*) AS COUNT FROM RESERVE 3WHERE ROOMCODE=? 4AND ((STARTDAY <= TO_DATE(?,'yyyy/mm/dd') 5AND TO_DATE(?,'yyyy/mm/dd') < ENDDAY) 6AND (STARTDAY < TO_DATE(?,'yyyy/mm/dd') 7AND TO_DATE(?,'yyyy/mm/dd') <= ENDDAY)); 8
等修正してみましたが、やはり重複していてもtrueを返してしまいます・・
SQL文から間違っていますでしょうか?
大変お手数ですが、アドバイス頂けると幸いです。
どうぞよろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/15 13:39