ACCESSの商品販売管理システムで日付範囲検索の書き方について

このQ&Aのポイント
  • ACCESSで商品の販売管理システムを作っている場合、販売開始日・販売終了日が空の商品や、近々販売開始する商品や終了が未定の商品が存在します。こうした状況で指定した日にちに販売されている商品の一覧を作りたい場合、WHERE句の書き方を知りたいという質問です。
  • 現在、ACCESSで商品の販売管理システムを開発しています。商品マスタには、販売開始日と販売終了日のフィールドがありますが、常時販売している商品はこれらのフィールドが空になっています。また、販売開始日が過去であり、販売終了日が未定の商品や、販売開始日が未来であり、販売終了日が過去の商品も存在します。指定した日にちに販売されている商品を抽出するためのWHERE句の書き方について教えてください。
  • ACCESSを使用した商品の販売管理システムを開発しています。商品マスタには、販売開始日と販売終了日のフィールドがありますが、常時販売している商品の場合、これらのフィールドは空になっています。また、販売開始日が過去であり、販売終了日が未定の商品や、販売開始日が未来であり、販売終了日が過去の商品も存在します。指定した日にちに販売されている商品を抽出するために、SQLのWHERE句の書き方について知りたいです。
回答を見る
  • ベストアンサー

日付の範囲検索で

ACCESSで商品の販売管理システムを作っています。 商品マスタの中に、販売開始日、販売終了日のフィールドがあるのですが、常時販売している商品はこのフィールドは空になっています。 また、今まで販売していたけど近々終了する商品や、近々販売を開始するけど、終了が未定の商品は片方に日付が入り、もう片方は空になっています。 こういう状態で指定した日にちに販売されている商品の一覧を作りたいのですが、where の書き方が分かりません。 何も考えずに書くと、以下のようになると思います。 SELECT 商品マスタ.* FROM 商品マスタ WHERE (販売開始日 IS NULL AND 販売終了日 IS NULL) OR (販売開始日 IS NULL AND 販売終了日 >= #2003/12/15#) OR (販売開始日 <= #2003/12/15# AND 販売終了日 IS NULL) OR (販売開始日 <= #2003/12/15# AND 販売終了日 >= #2003/12/15#) ちょっと長いので、もっとスマートに書く事はできないものでしょうか。 よろしくお願いします。

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

  • ベストアンサー
noname#5584
noname#5584
回答No.1

動作確認していませんので、あまり自信がありませんが、 こんな↓感じでどうでしょう? SELECT * FROM 商品マスタ WHERE 販売開始日 <= #2003/12/15# UNION SELECT * FROM 商品マスタ WHERE 販売終了日 >= #2003/12/15# UNION SELECT * FROM 商品マスタ WHERE 販売開始日 IS NULL UNION SELECT * FROM 商品マスタ WHERE 販売終了日 IS NULL 複雑なOR条件を記述するよりパフォーマンスがよいのではないかと思うのですが....。

その他の回答 (1)

noname#5584
noname#5584
回答No.2

ちょっと訂正。↓ m(_ _)m SELECT * FROM 商品マスタ WHERE 販売開始日 <= #2003/12/15# UNION SELECT * FROM 商品マスタ WHERE 販売終了日 >= #2003/12/15# UNION SELECT * FROM 商品マスタ WHERE 販売開始日 IS NULL AND 販売終了日 IS NULL

関連するQ&A

  • is null のandについて(日付型)

    SQLのSELECTで困っています。 プロシージャに引数を渡してSELECTしようと考えています。 複数の日付(datetime)型の引数をand条件で結びたいです。 検索したくない場合はnullを渡す。 例) select A,B,C from XXX where A = '1' and (B = 引数 or 引数 is null) and (C = 引数 or 引数 is null) and (D = 引数 or 引数 is null) ===== B,C,D はdatetimeです。 この形ですと、B,C,D全ての引数に日付が入っていれば取得できる のですが一箇所でも引数に何もセットしないと値0件で帰ってきて しまいます。 せっかく(is null)を使用しているのに意味がありません。 良いお知恵は無いでしょうか。 よろしくお願いします。

  • WHERE句でOR ANDを使うと抽出が変

    SQLのwhere句について教えてください。Table_AとTable_Bはjoinされています。 下記の条件で、値を抽出したいです。型はintです。 Field1は必ずNULL Field2は値が1~14のどれか。それ以外にはマッチしない Field3は0か3のどちらかにマッチ。 Field4は2,3,4,8に以外にマッチ。 Field5は0,6のどちらかいにマッチ。 Field6はNULLを抽出 Field7はNULLを抽出 よって、下記のSQLを書きました。しかしながら、Field1~Field3まで抽出を かけた時に、1万件だったのが、Field1~Field5までを含めると、1万2000件に なってしまいます。なぜだかわかりません。何が間違っているかお教え 頂けないでしょうか?また正しいwhere句以下の条件はどのように正しく書けばいいのでしょうか? WHERE `TABLE_A`.`Field1` IS NULL AND `TABLE_B`.`Field2` = 1 or `TABLE_B`.`Field2` = 2 or `TABLE_B`.`Field2` = 3 or `TABLE_B`.`Field2` = 4 or `TABLE_B`.`Field2` = 5 or `TABLE_B`.`Field2` = 6 or `TABLE_B`.`Field2` = 7 or `TABLE_B`.`Field2` = 8 or `TABLE_B`.`Field2` = 9 or `TABLE_B`.`Field2` = 10 or `TABLE_B`.`Field2` = 11 or `TABLE_B`.`Field2` = 12 or `TABLE_B`.`Field2` = 13 or `TABLE_B`.`Field2` = 14 or `TABLE_B`.`Field3` = 0 or `TABLE_B`.`Field3` = 3 or `TABLE_B`.`Field4` <> 2 or `TABLE_B`.`Field4` <> 3 or `TABLE_B`.`Field4` <> 4 or `TABLE_B`.`Field4` <> 8 or `TABLE_B`.`Field5` = 0 or `TABLE_B`.`Field5` = 6 or `TABLE_B`.`Field6` is NULL or `TABLE_B`.`Field7` is NULL

  • 移植性のあるSQLの書き方(改)

    先に質問内容を書き間違えてしまいましたので、 改めて・・・ 現在Oracleを使用していますが、 将来他のDBに切り替える可能性もある、ということで、 移植性のあるSQLを書こうとしているのですが・・・ ある文字列フィールドの値がNULLか空文字列の場合を除く、 という判定式で困っています。 普通のDBだと、   field IS NOT NULL AND field <> '' と書くところですが、 Oracleの場合、空文字列=NULLなので、 上記の書き方をすると、field <> NULL という式が成り立たず、 常に偽になってしまいます。 空文字列との比較が常に成り立たないなら、   NOT ( field IS NULL OR field = '' ) では・・・と思ったのですが、これでもダメです。 空文字列と比較する部分があると、 式全体が常に偽になってしまうようです。 移植性があり、且つ、パフォーマンス的にも問題のない、 なにかよい書き方ないでしょうか。。??

  • 日付範囲の取得     早めにお願い!

    データを取得したいです SQLで2004/10/01と2004/10/11が入力されてないときに 選択したデータが取れるようにしたいんですがどうしたらいいですか。 丁度WHERE分のところですが SQL Server Management Studio Express使用 select '1' as 端末番号, 受注残.*, 取引先.取引先略名, 担当者.担当者番号, 担当者.担当者名, 区分明細.区分明細名, 区分明細1.区分明細名, 区分明細2.区分明細名, 取引先1.取引先略名 as 取引先略名1, 受注残.品目分類, 名称.名称名, '2', '3' from 受注残 LEFT JOIN 取引先 on 受注残.得意先番号 = 取引先.取引先番号 LEFT JOIN 担当者 on 受注残.売上担当者 = 担当者.担当者番号 LEFT JOIN 区分明細 On ( 受注残 .受注伝票区分 = 区分明細.区分明細番号) LEFT JOIN 区分明細 as 区分明細1 On (受注残.仮単価区分 = 区分明細1.区分明細番号) LEFT JOIN 区分明細 as 区分明細2 On (受注残.完納区分 = 区分明細2.区分明細番号) LEFT JOIN 取引先 as 取引先1 on (受注残.得意先番号 = 取引先.取引先番号 ) left join 名称 on 受注残.品目分類 = 名称.名称番号 where ('00001' = '99999' OR ('00001' <> '99999' AND 受注残.工場番号 = '00001')) AND 受注残.受注日 >= '2004/10/01' AND 受注残.受注日 <= '2004/10/11' AND 受注残.受注日 between '2004/10/01' and '2004/10/11' AND (区分明細.区分番号 = '01' Or 区分明細.区分番号 Is Null) AND (区分明細1.区分番号 = '40' Or 区分明細1.区分番号 Is Null) AND (区分明細2.区分番号 = '10' Or 区分明細.区分番号 Is Null) AND 取引先1.取引先番号 = '00001' AND 受注残.得意先番号 = '143500-03' and 名称.区分番号 like '%65%' and 名称.名称番号 like '%'+'0010'+'%' order by 受注残.工場番号, 受注残.受注日, 受注残.品目番号

  • 移植性のあるSQLの書き方

    現在Oracleを使用していますが、 将来他のDBに切り替える可能性もある、ということで、 移植性のあるSQLを書こうとしているのですが・・・ ある文字列フィールドの値がNULLか空文字列の場合、 という判定式で困っています。 普通のDBだと、   field IS NULL OR field <> '' と書くところですが、 Oracleの場合、空文字列=NULLなので、 上記の書き方をすると、field <> NULL という式が成り立たず、 常に偽になってしまいます。 移植性があり、且つ、パフォーマンス的にも問題のない、 なにかよい書き方ないでしょうか。。??

  • 複数条件による検索

    現在strutsを使用した「検索フォーム」を作成しています。 検索項目は6つあり、それぞれNOT NULLの項目と、NULL可の項目が あります。 全部NOT NULLですと、WHERE句で 「WHERE 項目A = '%?%'」 を条件にすればよいと思うのですが、NULL可の場合は 「WHERE 項目B = '%?%' OR 項目 IS NULL 」 となると思います。 しかしこれですと項目Bに検索条件で入力したものと NULL値のものが両方ヒットしてしまいます・・・ うまく文章がまとまらなくてとても恐縮ですが、 うまく構文を作る方法はないでしょうか・・・。 よろしくお願いします。

  • ファイルメーカーで3年後の今日の日付を常に入力したい

    ファイルメーカーPro8のWin版を使用しています。 現在、お客様へ販売した商品の保証終了日を自動入力させる フィールドを改造しようと思っているのですが、 自分の技術だと閏年の呪縛に苛まれてうまくいきません。 現在、[商品販売日]フィールドと[保証終了日]フィールドを 設け、商品販売日を入力すると、3年後の今日の日付を自動入力するように 設定しています。自動入力の計算値は、 商品販売日 + 365*3 + 1 となっています。 ただこれだと、例えば2006年4月1日に販売した商品の保証期限は 希望通り「2009年4月1日」となるのですが、 商品販売日フィールドに閏年の「2008年4月1日」を入力すると、 保証終了日が「2011年4月2日」になってしまいます。 これを何とか、「2008年4月1日」にしたいのですが、 お分かりになりますでしょうか? 宜しくお願い致します。

  • DLookup関数 アクセス

    開始日 2012/4/1 2013/4/1 終了日 2013/3/31 2014/3/31 金額 100,000 200,000 というテーブルのデータがある場合、 日付が2012/6/1なら 2012/4/1と2013/3/31の間だから、100,000を返す、 日付が2013/6/1なら 2013/4/1と2014/3/31の間だから、200,000を返す というvbaコードを作るにはどうすればいいでしょうか? Debug.Print DLookup("[金額]", "Tテーブル", "[開始日] = #2013/06/01# And [終了日] = #2013/06/01#") にすると、nullが返ってしまいますし 二つのフィールドをまたがってBetween andの使い方もわかりません。 コードを教えてください。ご教授よろしくお願いします。

  • Accessのフォームで、空欄のレコードを検索したい。

    Accessの自己流で使っているものです。 販売管理のデータベースを作ったのですが、 主なフィールドは、 仕入先、商品名、販売日などです。 そこでですが、 コマンドボタンで販売日が未入力のものを検索しようとしましたが、抽出ができません。 仕入先では検索ができました。 検索コマンドボタンと、仕入先抽出のテキストボックスを作り、 検索コマンドボタンのクリック時のマクロビルダで、 [仕入先]=[Forms]![販売フォーム]![仕入先抽出]   [仕入先]  テーブルのフィールド名   [販売フォーム] フォーム名   [仕入先抽出] 抽出したい仕入先を入力するテキストボックス そこで販売日についても抽出を掛けたく思い、 同様に、販売日検索未入力コマンドボタンを作り、 コマンドボタンのクリック時のマクロビルダで、 [販売日] like "is null" [販売日] like is null などやってみましたができませんでした。 少ない情報で申し訳ありませんが、補足情報は随時いれますので宜しくお願いいたします。

  • 日付?の比較で質問があります。

    バインド値1:2008/10/30 20:00(文字列) DB値A:有効開始日:20081002(char),有効終了日:99991231(char) DB値B:有効開始日:20081010(char),有効終了日:99991231(char) DB値C:有効開始日:20081010(char),有効終了日:99991231(char) DB値D:有効開始日:20081029(char),有効終了日:99991231(char) where句でバインド値1 between 有効開始日 and 有効終了日としました。 単体試験で形式のミスに気付かず、また試験結果も全て取得できていたのですが、先日取得できないレコードがある事が分かりました。 本番環境の取得結果が上記のA,B,Dで、Bと同じデータなのにCが取得できません。 なぜ同じ条件で取得できるレコードとできないレコードがあるのかが 不明です(いっそ全部取れない or 全部取れるなら合点もいくのですが・・・)。 ※実際のSQLはもう少し煩雑ですが、条件式を一つずつ確認して上記の部分が問題である事までは確認しました。 情報がこれでは不足かもしれませんが、宜しくお願い致します。