- ベストアンサー
MySQLで年と月を別々のカラムに収納しています
- MySQL5.1を利用してデータベースを作成し、テーブルに年と月を別々で収納しています。
- しかし、そのテーブルの中から「今月を過ぎていなければ」という条件で抽出したい場合に、SQLの書き方がわかりません。
- 質問者はSQLの基礎を学んでおり、Navicat Liteアプリを使用しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
SELECT A FROM hoge_tbl WHERE B='hoge' AND DATE_FORMAT(NOW(),'%Y%m')< CONCAT(YEAR,CASE LENGTH(MONTH) WHEN 1 THEN '0' ELSE '' END,MONTH) です。 ただし、年、月をCHARで設定する方法はあまりお勧め出来ません。
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
まず、数字をcharで管理すると状況によって想定外の結果を返す場合が あることを理解しなくてはいけません。 とくにSQLでその手の持ち方をすると効率もわるく、あまりお勧めしません。 ちなみにサブクエリを覚えたてでなんとなく使いたいころなのでしょうけど これはサブクエリで処理する内容じゃないと思いますよ・・・ ロジックとしては・・・ 今日の年がYEAR以下か、今日の年がYEARと同等かつ今日の月がMONTH以下 と考えれば、こんな感じ? select A from hoge_tbl where B = 'hoge' and (YEAR(@TODAY:=CURDATE())<`YEAR` OR YEAR(@TODAY)=`YEAR` AND MONTH(@TODAY)<=`MONTH`)
お礼
お礼が遅くなって申し訳ありません。 見ようみまねでやっていたのですが、どうしても動かず DATE_FORMAT(NOW(),'%Y') <= YEAR AND DATE_FORMAT(NOW(),'%m') <= MONTH のようにしていましたが、当然年をまたぐところでうまくいかなくなってしまいました。 今一度やりなおしてみたところうまくいきました。 ありがとうございました。
- kosukejlampnet
- ベストアンサー率44% (126/282)
データ型をどう設定しているかによってSQLが変わります。
補足
回答ありがとうございます。 そうなんですね。 YEARはchar、長さ8、少数0、 MONTHはchar、長さ4、少数0、 に設定しています。 YEARは数字4ケタで収容してあり、 MONTHは数字1ケタまたは2ケタ(1ケタの場合でも頭に'0'はついていません) で収容しております。 よろしくお願いいたします。
お礼
お礼が遅くなって申し訳ありません。 長い時間かかってようやく解決いたしました。(ずっとやっていたわけではありませんが。。。) 文法的に教えていただいた記述の内容が理解できたのですが、 そうしてもうまく動かず、自分におデータベースの作成内容に疑問を持ってしまい、YEARとMONTHをそれぞれ比較して動かしていたところ、年を過ぎるところでおかしくなりました。 また今回実数を代入してみたり、あれこれ試してみたところ、結局 『 ' 』 の記述する部分などに誤りがあったようで、『 ' 』が必要な部分と不要な部分をあれこれ試して結果うまくいきました。 うまくいった文を教えていただいたものと比較したところ、まったく教えていただいた通りでした。。。 回り道をしてしまい、かつお礼が遅くなってしまってすみません。 ただ最初に教えていただいた内容の文法を理解して、今回あらためて取り組んだことにより解決できました。 本当にありがとうございました。