- ベストアンサー
時間範囲が重複したレコードを返すSQL
- PostgreSQLのデータベースで、指定した時間範囲のレコードが重複する場合にエラーを返すSQL文を作成したいです。
- 指定した開始時間と終了時間の間に既に存在するレコードがある場合はエラーを返し、存在しない場合にはINSERT処理を行うSQL文を作成したいです。
- 重複している時間範囲のレコードを返すためのSQL文を作成したいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
PL/SQLなら判るんですが。 reserveテーブルに対して、 SELECT COUNT(*) AS C FROM reserve WHERE reserve_date = 'reserve_date' AND ( start_time BETWEEN S_time AND E_time OR end_time BETWEEN s_time AND E_time) とすれば、時間が重なっているレコード数が取れます。Cの値が「0」であればINSERT可能です。 一つのSQL文では、ムリなので、重複レコードがあるかをチェックし、無ければINSERT処理を、あればSELECT文を発行してください。
その他の回答 (2)
- PAPA0427
- ベストアンサー率22% (559/2488)
というか、 reserve_date はdateですよね。 あなたのご質問は時間ですよね。しかも、OKの時とNGの時の条件が重なっています。その辺を、もう少しお願いします。 それと10:00~12:00うんぬんは、「start_time time 」に対してですね。19:00~19:05は「end_time time」に対してですよね? で、しかも結果を同じテーブルにINSERTするのですよね? なぜでしょう?理由が不明なんですが…。
補足
やりたいことは会議室を予約するような感じなんです。 つまり、10:00~12:00というのは、通常 10:00がstart_time、12:00がend_timeに格納します。 ただし、例えば10:00~11:00で会議室が予約(レコードに存在)済みの場合は、 予約(INSERT)できずエラーとしたいのです。 質問がわかりずらくすみません。
- PAPA0427
- ベストアンサー率22% (559/2488)
条件が明確ではありません。 カラム内容に対して、 >19:00から19:05はOKで、INSERT処理を行う >10:00から12:00はOKで、INSERT処理を行う どのようなINSERT処理ですか? >18:55から19:05はNGで、重複したレコードを返す >10:00から12:05はNGで、重複したレコードを返す どのカラムに対して比較するのですか? これでは、SQL文は書けません。
補足
◆テーブル名は、reserveでカラムは3つです。 reserve_date date start_time time end_time time >>19:00から19:05はOKで、INSERT処理を行う >>10:00から12:00はOKで、INSERT処理を行う >どのようなINSERT処理ですか? 重複時間がなければ、以下でINSERTしようと思います。 INSERT INTO reserve (reserve_date,start_time,end_time) VALUES ('2003/05/18','19:00','19:05'); >>18:55から19:05はNGで、重複したレコードを返す >>10:00から12:05はNGで、重複したレコードを返す >どのカラムに対して比較するのですか? 同じ日付のレコードに対して比較します。 以下のSQLで、ANDの先・・・で重なる時間がすでに存在するかを比較したいのですが、私の頭では思いつかないです。 SELECT * from reserve WHERE reserve_date = 'reserve_date' AND ・・・・・ よろしくお願いします。
お礼
PAPA0427さん。ありがとうございます。 おかげさまで実現することができました(^^) 12:00~16:00が登録されていて、 16:00~16:30はOKとする場合、BETWEENのところを、 start_time > S_time AND start_time < E_time OR end_time > S_time AND end_time < E_time でいけました。