新しく質問する

時間範囲が重複したレコードを返すSQL

役に立った:2件
  • 質問者:matchori
  • 投稿日時:2003/05/18 15:32
  • 困り度:すぐに回答が欲しいです
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

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で、重複したレコードを返す

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:2件)
  • 参考になった:0件

No.3ベストアンサー20pt

  • 回答者:PAPA0427
  • 回答日時:2003/05/18 20:16

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文を発行してください。

通報する

この回答へのお礼

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

  • 参考になった:0件
  • 回答者:PAPA0427
  • 回答日時:2003/05/18 19:03

というか、

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

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

  • 参考になった:0件
  • 回答者:PAPA0427
  • 回答日時:2003/05/18 16:00

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

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

よろしくお願いします。

  
このQ&Aは役に立ちましたか?(役に立った:2件)

このページのトップへ

Facebook公式ページ

公式Twitter