MS Access Tips/Sample and VBA and Blog customize etc...

クエリでの期間の抽出条件 応用編

前回、クエリでの期間の抽出条件 という記事を書きましたが、先日、下記のような質問に回答したのがきっかけです。前回のは基礎知識、今回のはその応用ということになりますね。

T_スポーツイベント
IDスポーツ名開始月終了月
1野球410
2ゲートボール26
3スキー125

野球は、4月から10月まで行われる。スキーは12月から翌年の5月まで行われる。
つまり、終了月が開始月が大きい場合は、1月~終了月、開始月~12月と考える。

このようなテーブルに対して、パラメータで[開始期間]と[終了期間]を月(1~12)で入力する。
このパラメータも[終了期間]より[開始期間]が大きいとき、1月~終了期間、開始期間~12月と考える。

両方の期間が一部でも重なれば抽出したい。

これは、かなり複雑なことになりそうな。。。。

難易度:

前回の記事では、開始時期 < 終了時期 というので前提でしたが、今回は、フィールドデータも、抽出条件も 終了時期 < 開始時期 と逆になる場合があり、その場合は、1月~終了時期、開始時期~12月と考える、というのがみそですね。

そのため次の4パターンが考えられます。

パターン抽出条件フィールドデータ
1開始月 <= 終了月Date1 <= Date2
2開始月 <= 終了月Date2 < Date1
3終了月 < 開始月Date1 <= Date2
4終了月 < 開始月Date2 < Date1

パラメータ 開始月, 終了月
フィールド名 Date1, Date2

「パターン1」は前回の記事と同じですので、下記の抽出条件式になります。

期間パターン1

同時に、開始月 <= 終了月 And Date1 <= Date2 という条件も必用ですから、

条件1

「パターン2」はフィールドデータの前後が入れ替わって年をまたぐパターンです。
前回の記事と同様に図示すると下記のようになります。

期間パターン2

条件に合致するのは、A, B, D, E, F の5パターンですが、前回の記事を読んだ人はもう分かりますね。この条件を全て列挙するのではなく、Cパターン以外と考えるとシンプルな条件式になるということは。

また、Notを使わずに下記のように記述できるのも前回と同様です。

前回も今回も Not(・・・) の式を Not を使わない式に変換できましたが、実は、この変換は、高校数学で習った「ド・モルガンの法則」というものです。

ド・モルガンの法則とは - IT用語辞典 Weblio辞書

高校数学も意外とプログラミングに役立つものです。

[終了月] < [開始月] かつ Date2 < Date1 の場合の条件ですので、この条件も加えて、

条件2

「パターン3」は抽出条件の前後が入れ替わって年をまたぐパターンです。同様に図示すると下記のようになります。

期間パターン3

条件に合致するのは、A, B, C, E, F の5パターンですが、これも同様にDパターン以外と考えるとシンプルな条件式になります。

また、Notを使わずに下記のように記述できるのも前回と同様です。

[終了月] < [開始月] かつ Date1 <= Date2 の場合の条件ですので、この条件も加えて、

条件3

「パターン4」は抽出条件もフィールドデータも前後が入れ替わり年をまたぐパターン。図示すると下記のようです。

期間パターン4

この図をみるとすべてのパターンがマッチするのがわかります。下記の条件のみでOKということになります。

条件4

条件1条件4 を OR でつなげたのが欲しい結果となります。

条件2条件3の後半部分が同じなので、冗長性を排除すると、

このようになるべく条件式は、冗長性を排除してシンプルなものにしたほうが処理は高速になりますね。

また、フォームに結果を表示するなら、VBAで条件式を生成して、フィルターをかけるようにするとさらに条件式をシンプルにできます。

コンボ1、コンボ2 で 1~12 まで選択できるようにして、


拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/280-a6af4217
該当の記事は見つかりませんでした。