質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

1回答

261閲覧

日付の重なり検索について

hiro3200184

総合スコア4

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2018/07/27 14:08

postgres9.2を使用しています。

以下のようなレコードをもつテーブルAから今回チェック対象となるテーブルBの内容がテーブルAの日付(開始・終了)の期間に重なっていないかをチェックするSQLを考えているのですが、結果だけ見ればできているのですが、速度がレコードが多くなるにつれ厳しくなってくるので、皆様よりアドバイスをいただきたく質問を投下させていただきした。

検索対象テーブルA(レコード数10万程度)
pkey
開始日
終了日
曜日no

チェック対象テーブルB(レコード数最大7千程度)
開始日
終了日
曜日no

これを単純に
テーブルA開始日 ≦ テーブルB終了日 AND 
テーブルB開始日 ≧ テーブルA終了日

とすると重なりはすべて抽出されるのですが検索時間が
かなりかかり、どうにか縮められないかと四苦八苦してます・・・

補足ですが、テーブルAはもともと別テーブルのレコードを展開して作成しているテーブルとなります。
そもそもが、用途と期間を指定して作成されているもので、用途には「日時」「期間指定」「曜日指定※時間のみ指定」「季節指定※月日時分のみ指定」が存在し選択できる期間は2018~2035の間となります。

ぶしつけな質問内容と心得ていますが、何か突破口となる糸口にでもたどり着ければと思っていますのでなにとぞアドバイス等よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

インデックスは作成されてますか?
その条件だと、
テーブルA(曜日No,開始日,終了日)、テーブルB(曜日No,終了日,開始日)のインデックスが効率良さそうです。

その他、条件を以下の様にし

SQL

1where int4range(A.開始日,A.終了日,'[]') && int4range(B.開始日,B.終了日,'[]')

それぞれ、**int4range(開始日,終了日,'[]')**という関数インデックスを作成するとか。

投稿2018/07/27 14:27

編集2018/07/27 14:30
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問