- ベストアンサー
SQLでの日付比較
いつもお世話になっております。 SQL文に関して質問ですが、テーブルに年と月が別に入っているフィールド(4桁、2桁の数値型)があり本日から3年以内のものを抽出するにはどうやって書くのがいいのでしょうか? 日付のフィールドは無いので計算するのは月だけでいいのですが・・・。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>ただ、今確認したら、桁数を指定していませんでした。 >基本的に入力自体はそれ以上の桁数は入れられないようになっているのですが、>月が一桁の場合はこれだと対応できませんでした。 月が数値型なら、桁数は関係なく#1さんのやり方でできそうなきがするのですが。 2002, 1 2002*100+1 = 200200+1 = 200201 2001, 12 2001*100+12 = 200100+12 = 200112 2001, 8 2001*100+8 = 200100+8 = 200108 2000, 11 2000*100+11 = 200000+11 = 200011 具体的にはどのような不具合があるのでしょうか? 「本日日付※ / 100 」の部分は小数を切り捨てた方がよさそうです。 ちなみに、フィールド側に式を記述するのは、速度的には良くないので、次のように記述した方がその点は改善できます。 WHERE (年 > 切り捨て(本日日付 / 10000) - 3) OR ((年 = 切り捨て(本日日付 / 10000) - 3) AND (月 > (切り捨て(本日日付 / 100) - 切り捨て(本日日付 / 10000) * 100)))) ・DBMSが不明なので、切り捨て関数は適切なものに置き換えて下さい。
その他の回答 (2)
- rotesKomet
- ベストアンサー率31% (83/265)
>>フィールド側に式を記述するのは、速度的には良くないので >#1様の回答より、rotesKomet様から教えていただいた、下部分の記述の方が動きが早いという事でしょうか? もしよろしかったらお教えいただければ幸いです。 レコード件数が少ないときはそれほど変わりませんが、多くなると速度に差が出てくる可能性があります。 フィールド側に式を記述すると、100万件のレコードが存在すれば、その100万件全てに対して計算を行ってから条件の比較を行います。 条件の値側で計算すれば、レコード件数に関わらず100回です(条件との比較は100万件ですが)。 また、インデックスの設定されたフィールドに対して計算を行った結果を使用すると、インデックスの効果はなくなります。
お礼
わざわざ説明いただきありがとうございます。 なぜそちらの方が動作が速いのかよく分かりました。 ちなみに現在年、現在月をとって比較する形に落ち着きました。 (年 > (現在年 - 3)) or ((年 = (現在年 -3)) and (月 > 現在月)) 一旦データの数値を年月日形式に置き換えて比較するイメージだったのでこんな簡単にできて大変助かりました。 ありがとうございました。
- siteuma
- ベストアンサー率28% (77/271)
例えばこんな感じ?(WHERE句のみ) WHERE 年 * 100 + 月 >= 本日日付※ / 100 - 300 ※本日日付は数値に変換
お礼
ご回答ありがとうございます。 やっと意味がわかりました。 面白いですね。こんなやり方があるんですね。 ただ、今確認したら、桁数を指定していませんでした。 基本的に入力自体はそれ以上の桁数は入れられないようになっているのですが、月が一桁の場合はこれだと対応できませんでした。 他に案がございましたらお願いできますでしょうか?
お礼
ご丁寧な説明ありがとうございます。 本日日付とデータを混同しており、完全に勘違いしていました。よく考えたらそうでした。問題なく動作しました。 ちなみに >フィールド側に式を記述するのは、速度的には良くないので とはどういうことでしょうか? #1様の回答より、rotesKomet様から教えていただいた、下部分の記述の方が動きが早いという事でしょうか? もしよろしかったらお教えいただければ幸いです。 DBはMySQLでphpを使用したwebアプリケーションです。