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

このQ&Aのポイント
  • PostgreSQLのデータベースで、指定した時間範囲のレコードが重複する場合にエラーを返すSQL文を作成したいです。
  • 指定した開始時間と終了時間の間に既に存在するレコードがある場合はエラーを返し、存在しない場合にはINSERT処理を行うSQL文を作成したいです。
  • 重複している時間範囲のレコードを返すためのSQL文を作成したいです。
回答を見る
  • ベストアンサー

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

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

質問者が選んだベストアンサー

  • ベストアンサー
  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.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文を発行してください。

matchori
質問者

お礼

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

その他の回答 (2)

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.2

というか、 reserve_date はdateですよね。 あなたのご質問は時間ですよね。しかも、OKの時とNGの時の条件が重なっています。その辺を、もう少しお願いします。 それと10:00~12:00うんぬんは、「start_time time 」に対してですね。19:00~19:05は「end_time time」に対してですよね? で、しかも結果を同じテーブルにINSERTするのですよね? なぜでしょう?理由が不明なんですが…。

matchori
質問者

補足

やりたいことは会議室を予約するような感じなんです。 つまり、10:00~12:00というのは、通常 10:00がstart_time、12:00がend_timeに格納します。 ただし、例えば10:00~11:00で会議室が予約(レコードに存在)済みの場合は、 予約(INSERT)できずエラーとしたいのです。 質問がわかりずらくすみません。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

条件が明確ではありません。 カラム内容に対して、 >19:00から19:05はOKで、INSERT処理を行う >10:00から12:00はOKで、INSERT処理を行う どのようなINSERT処理ですか? >18:55から19:05はNGで、重複したレコードを返す >10:00から12:05はNGで、重複したレコードを返す どのカラムに対して比較するのですか? これでは、SQL文は書けません。

matchori
質問者

補足

◆テーブル名は、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

  • 重複レコードの上書きについて

    重複レコードを上書きするSQL構文についての質問です。 SELECT文で更新対象のレコードが、 すでに存在しているかをどうかを確認にしてから、 UPDATE文を発行して更新する方法と、 DELETE文を発行して更新対象のレコードを削除した後に INSERT文で更新文のデータを追加する方法があるのですが、 処理的にはどちらが早くなるのものなんでしょうか?

  • SQLで、重複レコードを削除

    no type name ---------------------------- 1 1 peach 1 1 peach 2 5 tomato 4 6 apple 4 6 apple 1 1 peach  上記のように、重複するレコード(行)が存在してしまっているテーブルで、重複をなくす処理を、SQLで簡単に行なうにはどうしたら良いでしょうか。MySQLです。上の例では、下のように更新したいのです。よろしくお願いします。 no type name ---------------------------- 1 1 peach 2 5 tomato 4 6 apple

    • ベストアンサー
    • MySQL
  • 重複データをカウントするのに便利なSQL文

    phpで検索結果画面の制作を勉強中です。 pdoでmysqlデータベースに接続しています。 添付画像のように、 重複しているデータをひとつにまとめ、それぞれの重複数を取得するようなSQL文はないでしょうか? ちなみにできれば、添付画像のように、 フォームで入力されたテキストをもとに、 WHERE文でカラム名をあいまい検索をした上で 該当する重複レコードのカラム名を1つだけ表示し、その横に重複数を表示したいです。 フォームのテキストをもとにあいまい検索をする方法は理解しておりますので、 該当する重複レコードのカラム名を1つだけを取得し、その重複数も取得できるようなSQL文があれば教えていただきたいです。 色々と試しては見たのですが、中々上手くいかずに悩んでいます。 ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • BULK INSERTのエラー取得は可能なのでしょうか?

    こんばんは。 お世話になります。 SQL Server初心者です。 現在、CSVファイルに出力された他のデータベース(Paradox)のデータをSQL Server2005に移行するためのツールを作成しています。 Paradoxでは、以下のように、(1)と(2)のレコードが存在した場合、重複エラーとならなかったのですが、SQL Serverでは、当然ながら、重複エラーとなってしまいます。  (1)aaaaa, 1, あいうえお  (2)AAAAA, 1, かきくけこ  ※aaaaaとAAAAAが主キーの場合 CSVファイルのレコードは、多いもので700万件も含まれ、これを1行読み込み、既存データか否かをチェックし、既存の場合はINSERTしないという処理を700万回繰り返すと、相当な時間がかかり、性能向上を求められています。 そのため、BULK INSERTを使用する方向で検討してみました。 しかし、CSVファイルに主キー重複したレコードが存在すると、エラーが返されますが、BULK INSERTでは、どのレコードでエラーになったかまでは取得することができません。 ずいぶん、調べてみたのですが、無理のようでした。 BULK INSERTでエラーとなる箇所を特定する方法は本当にないでしょうか? もし、無理ならば、何か他にエラー箇所を特定して速くINSERTするコマンド、方法はないでしょうか? お知恵をお借りしたく、よろしくお願いいたします。

  • postgresqlにて全レコードのupdate

    PostgreSQLの全レコードを順次Updateしたいのですが、 SQLの記述方法がわかりません。 [やりたいこと] ユーザ情報を保持しているテーブルに、新しく"ID_TMP"カラムを追加。 カラム"ID_TMP"に、ユーザIDを保持しているカラム"ID_INFO"の内容を書き込む。 コピーしたいレコードが単一の場合、次のSQLで可能だと思うのですが、 テーブルに保持している全レコードを順次処理する方法を教えてください。 update [テーブル名] set ID_TMP = (select ID from [テーブル名] where id = [ID名]); 宜しくお願いいたします。

  • SQL文で、重複データの上書きはできますか

    一定範囲(複数)のデータを追加したい場合、 追加する時に、既に既存のデータがある場合は、 データを上書きし、無い時は、データを新規追加 する、ということをやりたいのですが、SQL文で、 そのような命令はあるでしょうか。 Excelで打ち込んだ、数件のデータを、データベース 用の別のExcelシートに一気に保存したい時に、 この問題が生じてしまいます。 (INSERT命令のみだと、すべて新規となるので、 重複データができてしまい、何が新規でなにが新規 でないかをいちいち区別し、処理を分けるのも 困難です)。 非常に初歩的かもしれませんが、お願いします(ちなみに、ExcelVBAで、SQLを使おうと思っています)。

  • SQLの重複検索の高速化について

    EXCELのデータをSQLサーバにインポートさせているのですが、 インポートの重複有無を判断するために3つのキーを 使用しています。 現状の方法としては、  Dim rsRecord As ADODB.Recordset  Set rsRecord = New ADODB.Recordset  rsRecord.Open XXXX 'レコードを開く  rsRecord.Filter = "(A='あ') And (B='い') And (C='う')" のような形でrsRecordが1以上かどうかで重複を確認しています。 (Filterのキーとなる”あ、い、う”はEXCELから取得するデータです。) 上記で重複はチェックが出来るのですが、DBの都合上、1レコード辺り 16回繰り返す必要がある為、1レコードの処理に2秒程度かかっています。 EXCELのデータ数が多いため、1回のインポート処理に30分以上掛かってしまっており、困っています。 重複チェックを高速にする良い方法はないでしょうか。 データベース初心者のため、色々方法を探した結果、上のような 処理以外見当たらず困っています。よろしくお願いします。

  • 重複レコードを高速で取得するSQL

    Access(mdb)から約2万件レコードのあるテーブルがあるとします。 列数は20ほど。 その中から、3つの列において重複しているレコードを取得したいのですが、 高速に取得する方法はありますでしょうか? (VB.NETで、重複レコードをユーザーに示す処理を作成したいのです) 以下のSQLを試したところ、1分以上時間がかかってしまいました。 ----------------------------- SELECT * FROM テーブルA table1 WHERE EXISTS ( SELECT * FROM テーブルA table2 WHERE table1.列A = table2.列A   table1.列B = table2.列B   table1.列C = table2.列C GROUP BY table2.列A HAVING COUNT(table2.列A) > 1 ) ----------------------------- アドバイスをお願いします。

  • phpPgAdminからSQL文を発行し、重複しない文字列を挿入したいのですが・・・

    下記のような nickname テーブルがあります。 nickname | id | name | | 1 |あいうえお | | 2 |hogehoge | カラム「name」はユニークな値として設定してあります。 そこで、phpPgAdminを使用し下記のようなSQLを発行するとニックネームが重複しているとエラーが発生してしまいます。 INSERT INTO nickname VALUES (3,'(2)'); INSERT INTO nickname VALUES (3,'(8)'); 「(2)」と「(8)」が同じ文字と判断されているようなのですが、なぜなのか教えて欲しいです。 また、これを回避する方法はあるのでしょうか? 他にも「@@@」と「.BW」も同じ文字として認識されてしまうようです。 SQLのバージョンはPostgreSQL 7.4.7を使用しております。 --追記-- 上記で説明している「(2)」と「(8)」ですが、○に囲まれた数字文字です。 なぜか、gooに投稿すると()半角括弧でかこまれた文字になってしまいます・・・

  • 重複レコードについて

    重複レコードについて ACCESS2002での話になります。 テーブルに下記レコードが複数存在します。 (例) フィールド1 フィールド2 フィールド3 愛知 田中 12 愛知 田中 11 愛知 田中 13 三重 山本 23 三重 山本 21 岐阜 鈴木 33 岐阜 鈴木 34 上記を下記の形で抽出したいと考えております。 フィールド1 フィールド2 フィールド3 愛知 田中 12 三重 山本 23 岐阜 鈴木 33 条件はフィールド1で重複がなくなるように抽出したいです。 フィールド3はどの値を抽出してもかまいません。 DESTINCTでの抽出を考えたのですが、それだと全てのカラムに DESTINCTがかかって希望の抽出が出来ませんでした。 何卒ご教授お願いいたします。