dポイントプレゼントキャンペーン実施中!

PostgreSQL(データベース)の
カラムに指定した時間範囲が存在する場合、エラーとし
存在しない場合、INSERTしたいのですが、
どのようなSQLを書けば良いでしょうか?

◆カラム内容
開始時間 終了時間
12:00   14:00
14:00   19:00
という2つのレコードが格納されていた場合に、
以下のSELECT→INSERTという流れで考えています。

19:00から19:05はOKで、INSERT処理を行う
18:55から19:05はNGで、重複したレコードを返す
10:00から12:00はOKで、INSERT処理を行う
10:00から12:05はNGで、重複したレコードを返す

A 回答 (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文を発行してください。
    • good
    • 0
この回答へのお礼

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
でいけました。

お礼日時:2003/05/18 20:56

というか、



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)できずエラーとしたいのです。

質問がわかりずらくすみません。

補足日時:2003/05/18 19:22
    • good
    • 0

条件が明確ではありません。



カラム内容に対して、
>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 ・・・・・

よろしくお願いします。

補足日時:2003/05/18 18:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す