• ベストアンサー

betweenを使うyyyy/mm/ddでの範囲検索

 2007年1月1日 から 2008年5月5日のデータがほしいのですが、どのような書き方をすればいいのか思いつきません。  年、月をまたがなければbetweenで指定できるのはわかりました。 わからない点は年をまたぐ、もしくは月をまたぐ場合はまた1月から、1日からの検索をしなければならないというところです。  検索するにしても、どんな単語で検索をかければいいのかわかりません。  ヒント、もしくは検索で使うキーワードでよろしいのでよろしくお願いします。

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

  • ベストアンサー
回答No.4

#2です。 SQL99で規定され、MySQLでも実装されている行値構成子(または行値式)と呼ばれる構文を使えば簡単です。 where (年,月,日)>=(2007,1,1) and (年,月,日)<=(2008,5,5) #3さんの提示したようなSQLでも実現できますが、条件式で関数を使ったりして列を加工すると、MySQLの場合、インデクスが使われない場合が多いので、性能を重視する場合はEXPLAINで十分に確認してください。

curve_2008
質問者

お礼

>MySQLの場合、インデクスが使われない場合が多いので、性能を重視する場合はEXPLAINで十分に確認してください。  そういう制限がやはりMYSQLでもあるんですね、よく確認してみます。  いろいろ考えてこのようなクエリを書いてみました。 where ((t_yyyy <= 2008 ) && ( t_yyyy <= 2008 && t_mm <= 5 ) && ( t_yyyy <= 2008 && t_mm <= 5 && t_dd <= 5 )) && (( t_yyyy >= 2007 ) && ( t_yyyy >= 2007 && t_mm >= 1 ) && ( t_yyyy >= 2007 && t_mm >= 1 && t_dd >= 1 )) やってることはchukenkenkou様のサンプルと同じだと思いますが、長い上にわかりづらいですね。 chukenkenkou様のサンプルを参考にもう一度どうすればよいのか よく考えてみます! ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

各カラムの値を使って、DATE型の値を作ってBETWEENで比較すれば良いと思いますよ。 SELECT * FROM table WHERE DATE(concat_ws('-',yyyy,mm,dd)) BETWEEN '2007-01-01' AND '2008-05-05';

curve_2008
質問者

お礼

お返事ありがとうございます。返信が遅れて申し訳ございません。 実行可能なサンプルまでいただいて感謝しております。 ありがとうございます!!

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

日付が入っている列のデータ型は、date型ではないのですか? 年月日を、それぞれ別の列に格納しているのでしょうか?

curve_2008
質問者

補足

回答ありがとうございます。返信が遅れて申し訳ございません。 私の説明不足でした。 年_yyyyと月_mmと日_ddという3つのデータ型に分かれており、 3つともint型です。 そのため、年、月、日で3回betweenを使って検索したところ、 半端な結果しか得られなかったということです。 今考えている別の方法があるのですが、 今度はこういう形で検索してみたいと思います。 2007年1月1日から2008年5月5日までの範囲を検索したとします。 最初の2007年1月のデータをまずとりだす式を書きます。 それをORで2008年5月以外の2007年2月から2008年4月の間を検索する式と繋ぎ、 最後に2008年5月1日から5日までのデータを検索する式とまた ORでつなげればうまくいくかなぁと。 書いた式は select * from table where yyyy = 2007 && mm = 1 && dd between 1 and 31 or yyyy between 2007 and 2008 && mm between 1 and 12 && dd between 1 and 31 or yyyy = 2008 && mm = 5 && dd between 1 and 5; です。しかし、orで繋げた2つめの式で2008年の5月のデータがすべて読み込まれているので、 5日までではなく、31日まで表示されてしまいました。 う~ん、日付を3つのint型になんてわけなければよかったです。 もう間の値は年ごとに検索するしか方法はないのでしょうか? 説明がわかりづらくて申し訳ないです。 アドバイスよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>年、月をまたがなければbetweenで指定できるのはわかりました。 情報元は?? 指定日 between '2007-01-01' AND '2008-05-05' でいけるでしょ?

curve_2008
質問者

補足

回答ありがとうございます。返事が遅れました。 年、月、日と3つのint型にわかれています。 >年、月をまたがなければbetweenで指定できるのはわかりました。 は、選択された範囲が2008年5月のみならば、1日から5日までの 検索はできるということです。誤解を招く書き方でした、申し訳ないです。 ANO.2の捕捉に改めて書いた式を記載させていただきましたので、 アドバイス等いただければありがたいです。 私の説明力不足で申し訳ありませんでした。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • DataGridViewでyyyy/MM/dd

    SQLServer2008で作ったデータベースをVB2010のDataGridViewで表示させております。 DataGridViewで日付列を"yyyy/MM/dd"のスラッシュ入り10桁で表示させたいのですが表示されません。 データベース側でのデータ型は「date」となっております。 DataGridView1.Columns("日付").DefaultCellStyle.Format = "yyyy/MM/dd" こう記述すればいいと思ったのですが、「20111227」とスラッシュ無しで表示されてしまいます。 DataGridView1.Columns("日付").DefaultCellStyle.Format = "yyyy年MM月dd日" これは「2011年12月27日」と表示することを確認できました。 DataGridView1.Columns("日付").DefaultCellStyle.Format = "yyyy-MM-dd" これは「2011-12-27」と表示することを確認できました。 どのようにしたら"yyyy/MM/dd"形式で表示させることが出来るのでしょうか 指導のほど、よろしくお願い致します。

  • CSVで yyyy/mm/dd の形式で表示したい

    A1のセルに下記データが入っています。 2019年02月12日(火) 13時00分 ~ 14時00分 A1を参照して B1に2019/02/12 と表示したいのですが、うまくいきません。 TEXT関数やLEFT関数などなど試したのですが 2019年02月12日 表示されてしまったりします。 表示形式をいじってもだめでした。 なにが原因でしょうか? どうぞよろしくお願いいたします。

  • DateTime型の検索

    お世話になっております。 質問内容は基本的な事かもしれませんがご容赦ください。 あるテーブルにDateTime型のフィールドがあり、Insertした日時を保存しています。 このフィールドに対して、日付のBETWEENや時間のBETWEENで検索かけるにはどうしたら良いのでしょうか。 例えば、 時間は未指定だけど、1月1日から1月31日までのデータを検索 SELECT * FROM table WHERE insertDT BETWEEN '01-01' AND '01-31' 日付は不明だけど、7:00から12:00までのデータを検索する等です。 SELECT * FROM table WHERE insertDT BETWEEN '07:00' AND '12:00' これら試しましたが、正常な結果が得られず困っています。 不明な部分の代替文字でもあるのでしょうか。 SELECT * FROM table WHERE (insertDT >= '07:00' AND insertDT <= '12:00') これも試しましたがやはりダメでした。 どなたかご教示の程、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • Access BetweenとLikeの組み合わせ方

    Access2000(初心者) フォームで Between(指定日~指定日)の中でLike(チェック)を含まないレコードを検索削除したいです。 下記コードの場合 実行時エラー'3061': パラメータが少なすぎます。1を指定してください。 のエラーが出てしまいます。 どこを直せば良いでしょうか?宜しくお願いします。 CurrentDb.Execute "DELETE * FROM テーブル名 WHERE ([テーブル名].[日付] Between #2009/01/01# And #2009/02/02#) AND ((([テーブル名].[チェックボックス]) Like 'No')); "

  • インデックスを用いたbetween検索について

    Cで1~360000までのランダムな整数の列(col1)を含む100万件のデータを作成し(50MB弱)、 create table table1(・・・, col1 integer not null, ・・・); で作ったテーブルにload data infile文で挿入し、 create index index1 on table1(col1); でインデックスを作成しました。 select * from table1 where col1 between 1000 and 2000; といったような検索(約2500件ヒット)をしたいのですが、この検索ではインデックスを作らないテーブルのほうが速く検索できてしまいます。 select * from table1 where col1 between 100 and 200; のような検索(約250ヒット)ではインデックスの効果があり、高速検索ができますが。 環境はMySQL-5.0.26、ノートPC(256MB)、Fedora Core5、設定ファイルはMy-large.cnfを、ほぼそのまま使用しています。 上記のような少し大きめの検索範囲でもインデックスを用いた検索を改善する方法をご教授お願いします。何かのパラメータが決定的に足りないと思うのですが。

  • SQLのbetweenについて

    現在SQLを勉強しています。 C♯とSQLServerを使用しているのですが betweenを使って困った点があります。 自分で入力するAとB(どちらも数字)をbetweenの条件にしていしているのですが 例) select フィールド名 from テーブル where フィールド名 between A and B; → テーブルのフィールド名 の中のAからBのデータを選択する は問題ありません。 ですがAとBが未入力だとエラーが当然でてしまいます。 そこで未入力だとフィールド名の中を全件selectするようにしたいのですが、これはbetween で出来るのでしょうか? おそらくは条件であれこれ指定するのだと思いますが… 回答お願いします

  • 20060224をyyyy年mm月dd日にしたい

    こんばんは。教えてください。。 Sub テスト() Dim mystr As String mystr = "20060224" mystr = Format(mystr, "yyyy年mm月dd日") MsgBox mystr End Sub これを実行するとオーバーフローします。 結果としては、「2006年02月24日」と表示させたいです。 mystr = Format(CDate(mystr), "yyyy年mm月dd日") にすると、型が一致しませんになります。 ご回答よろしくお願いします。

  • Oracle to_dateのyyyy/mm/dd

    to_dateを以下のように使用した場合、正確なdate値(2011年2月1日)を取得できるのでしょうか。 select to_date('2011/2/01','yyyy/mm/dd') from dual; 自分で検証できる環境が無い(コマンドが叩けない)ので質問させていただきました。 (できればoracle8i環境で分かると助かります。) よろしくおねがいいたします。

  • 更新日時範囲を指定してファイル検索

    Windows7の標準のエクスプローラーを使って、ファイルの検索をしています。 日時、もしくは年月日の範囲を指定してファイルを検索したいです。 例えば、2011年1月1日~2012年1月1日の範囲で、かつ、*.jpgを探したいです。 こういった場合、右上の検索のボックスに何と記入すればいいでしょうか? jpg、と入力した後に、更新日時、とうっすら出ますが、選んでも年月日しか入力方法が 分からず、困っています。

  • pregでの日付検索

    例えば、2004年11月1日~2005年3月3日 のように期間を指定してpregで検索などは できるのでしょうか? 考えつくのはひとつづつ検索する方法しか思いつきません。。。

このQ&Aのポイント
  • 無線HUGE (M-HT1DRXBK)のデリートボタンの使い方がおかしいです。
  • マイクロソフト製品やブラウザなどを使用している際に、ボタン4を押すと「・(コロン)」が入力されて削除されません。
  • 新しいトラックボールでも同様の問題が発生します。設定のリセットも試しましたが改善しません。解決策を教えてください。
回答を見る