• ベストアンサー

SQLでの日付比較

いつもお世話になっております。 SQL文に関して質問ですが、テーブルに年と月が別に入っているフィールド(4桁、2桁の数値型)があり本日から3年以内のものを抽出するにはどうやって書くのがいいのでしょうか? 日付のフィールドは無いので計算するのは月だけでいいのですが・・・。 よろしくお願いいたします。

  • q-tip
  • お礼率77% (116/149)

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

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

>ただ、今確認したら、桁数を指定していませんでした。 >基本的に入力自体はそれ以上の桁数は入れられないようになっているのですが、>月が一桁の場合はこれだと対応できませんでした。 月が数値型なら、桁数は関係なく#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が不明なので、切り捨て関数は適切なものに置き換えて下さい。

q-tip
質問者

お礼

ご丁寧な説明ありがとうございます。 本日日付とデータを混同しており、完全に勘違いしていました。よく考えたらそうでした。問題なく動作しました。 ちなみに >フィールド側に式を記述するのは、速度的には良くないので とはどういうことでしょうか? #1様の回答より、rotesKomet様から教えていただいた、下部分の記述の方が動きが早いという事でしょうか? もしよろしかったらお教えいただければ幸いです。 DBはMySQLでphpを使用したwebアプリケーションです。

その他の回答 (2)

回答No.3

>>フィールド側に式を記述するのは、速度的には良くないので >#1様の回答より、rotesKomet様から教えていただいた、下部分の記述の方が動きが早いという事でしょうか? もしよろしかったらお教えいただければ幸いです。 レコード件数が少ないときはそれほど変わりませんが、多くなると速度に差が出てくる可能性があります。 フィールド側に式を記述すると、100万件のレコードが存在すれば、その100万件全てに対して計算を行ってから条件の比較を行います。 条件の値側で計算すれば、レコード件数に関わらず100回です(条件との比較は100万件ですが)。 また、インデックスの設定されたフィールドに対して計算を行った結果を使用すると、インデックスの効果はなくなります。

q-tip
質問者

お礼

わざわざ説明いただきありがとうございます。 なぜそちらの方が動作が速いのかよく分かりました。 ちなみに現在年、現在月をとって比較する形に落ち着きました。 (年 > (現在年 - 3)) or ((年 = (現在年 -3)) and (月 > 現在月)) 一旦データの数値を年月日形式に置き換えて比較するイメージだったのでこんな簡単にできて大変助かりました。 ありがとうございました。

  • siteuma
  • ベストアンサー率28% (77/271)
回答No.1

例えばこんな感じ?(WHERE句のみ) WHERE 年 * 100 + 月 >= 本日日付※ / 100 - 300 ※本日日付は数値に変換

q-tip
質問者

お礼

ご回答ありがとうございます。 やっと意味がわかりました。 面白いですね。こんなやり方があるんですね。 ただ、今確認したら、桁数を指定していませんでした。 基本的に入力自体はそれ以上の桁数は入れられないようになっているのですが、月が一桁の場合はこれだと対応できませんでした。 他に案がございましたらお願いできますでしょうか?

関連するQ&A

  • SQLの日付+その他の取得

    SQLで和暦と日付の変換後の表示を行いたいです。 フィールド名Aに6桁の数字(199811など)が入っていて これを(和暦)yy年mm月と表示させたいのですが、 SQLで変換可能なのでしょうか? フィールド名A,テーブル名B,(必要であれば)フィールド名Aの別名Cとして、 SELECTの構文を教えていただきたいです。

  • SQL ?で終わる

    アクセスのSQL文で、テーブルのフィールドの値が、最後が?で終わるものを抽出したいのですが SELECT テーブル.フィールド FROM テーブル WHERE (((テーブル.フィールド) Like "[*?]")); これだと1件も抽出されません。 Like "[*?]"が間違ってると思うのですが、どうすればいいでしょうか?

  • SQLでDATE型のデータを参照するのは?

    SQLであるテーブルから日付型のデータを秒単位まで参照したのですが... そうですね、例えば"TABLE01"というテーブルの"Field01"っていう項目から 2000年9月7日の11:45のデータを抽出したい場合は、どような SELECT文を発行すればよろしいのでしょうか? ちなみに自分がやっているのはORACLE7です。

  • SQLの日付と、DBの日付項目に対する比較について

    よろしくお願いします。 以下のように、DBには年月日がCHARの8桁で格納されています。 20050125 20050126 20050127 20050128 20050130 20030201 20030202 この項目に対し、システム日付から過去一週間以内の 日付を取得したいのですが、文字型とSQLのDATE型の 比較はどのようにすればよろしいのでしょうか? よろしくお願いします。

  • SQLの構文で質問です。

    いつもお世話になっております。 SQLの構文で質問です。 テーブルを開いて、データの中から日付を絞って抽出したいのですが、 whereの後にどのような記述をすればいいのかわかりません。 なんとなく『>』を使ってやってみましたがうまく抽出できませんでした。 例えば、2008/12/01~2008/12/31の絞りで抽出できるようにしたいのですが。 SELECT * FROM 日付 WHERE (日付   2008 / 12 / 01    2008 / 12 / 31) すみません、SQLを使い始めて間もなく本を見てはいるのですがうまくいかないもので。 宜しくお願いします。

  • DB2のSQL(日付)について

    文字列で8桁の日付(例:20041208)を持っている項目の条件に本日日付以上という条件をつけたいのですが、 (例:where NEN >= 本日日付の文字列8桁 ) ※NEN:20041208 SQLでシステム日付を文字列8桁にする方法はありますか? ご教授お願いしますm(_ _)m

  • SQL Server 2005 日付期間について(SQL文)

    恐れ入ります。 現在、SQL Serever 2005を利用し、VS 2005にて某システムを作成しています。 その中で、ある条件のデータをテーブルから削除する機能を作らなければならないのですが、以下がやりたい旨です。 [テーブル] SYSTEMTBL [定  義] systemYMD (varchar(8) ): 登録日付(例.20080725) systemHMS (varchar(6) ): 登録時間(例.103050) AAAAA (varchar(10)): カラム1 BBBBB (varchar(10)): カラム2 とあり、 SQL文を次のようにしたいです。 DELETE FROM SYSTEMTBL WHERE 登録日付 < 本日日付 - 日数 条件部分をどのようにすれば、 正しい日付の計算をしてくれるのでしょうか? 宜しくお願い申し上げます。

  • SQLサーバにある日付型のデータから特定の曜日を抽出する方法は?

    SQLサーバに日付と料金の入ったテーブルがあります。 例えば、下のようなデータがあるとします。 日付            料金 2005/11/08 11:15:00  5000円 2005/11/09 12:00:00  6000円 2005/11/15 15:15:00  4000円 2005/11/16 09:00:00  7000円 このテーブルから火曜日のデータだけを抽出したい場合、 どのようなSQL文を書けばよいのでしょうか? どうぞ、よろしくお願いしますm(_ _)m

  • ユニオンクエリで期間指定抽出のSQL記述について

    いつもお世話になっております。 Access 2007で、「人名集計」テーブルと「資料送付」テーブルがあり、それぞれ、同一のフィールド名でテーブルが作成されております。 これを「発送日」フィールドの昇順で並べ替えながら結合するユニオンクエリを作成しました。 SELECT * FROM 人名集計 UNION ALL SELECT * FROM 資料送付 ORDER BY 発送日; とりあえず、上記のSQLでは動いていますが、このSQLに、 「発送日」の期間を指定して、抽出条件(パラメータ)を加えようとしていますが、うまくいきません。 WHERE句を使って、Between 「最初の日付を入力」 And 「最後の日付を入力」 のような文を SQLの何処にどのように記述すればよいのか、教えてください。 宜しくお願い申し上げます。

  • 絞込みする時のSQLの書き方

    お世話になります。 絞込みする時のSQLの書き方について教えてください。 具体的には テーブル名tbl01,フィールド名f01,f02とした場合 1.f01もしくはf02にAという文字を含むレコードを抽出。 SQL = "select * from tbl01 where f01 like '%A%' or f02 like '%A%'" 2.続いて、1で抽出したデータからf01もしくはf02にBという文字を含むレコードを抽出するSQL文 SQL = ????? あくまでも、1と2を満たす条件を1つのSQL文で表す方法です。一旦、1の結果をワークテーブルに落とし、そこから2だけのSQL文を実行するわけではありません。

専門家に質問してみよう