• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL文の書き方)

SQL文でイベント情報を取得する方法

このQ&Aのポイント
  • イベント情報をキーワード検索できるページを制作している際、日付関係の条件指定方法が分からない場合、以下の方法を参考にしてください。
  • 条件:検索対象は今日から1年先までのデータ。開催中のイベントを開始日の近い順に表示する。テーブルのカラム名とデータ形式を考慮し、適切な条件文を作成してください。
  • SELECT文のWHERE句に以下の条件を追加します。 1. 開催日が本日よりも前で終了日が本日以降(開催中のイベント) 2. 開始日が今日に近い順番で並べる(ORDER BY句を使用) 3. 開始日の年、月、日のデータ形式により条件分岐を行う(IFNULL関数を使用)

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

  • ベストアンサー
  • takubou05
  • ベストアンサー率52% (11/21)
回答No.3

2です。 型がtextっていうのはさすがにおかしいと思います。 varcharかintにするべきかと。 とりあえず動くSQLを貼っときます。 ちゃんと検証していないので、 適当になおしてください。 SELECT * FROM event WHERE ( ( date_s <= DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 year), '%Y%m%d') AND date_e >= DATE_FORMAT(CURDATE(), '%Y%m%d') ) OR date_s_year IS NULL ) order by CASE WHEN date_s_year is null THEN CASE WHEN concat(date_s_month, date_s_day) < DATE_FORMAT(CURDATE(), '%m%d') THEN CASE WHEN date_e_month is null THEN 2012 WHEN concat(date_e_month, date_e_day) >= DATE_FORMAT(CURDATE(), '%m%d') THEN 2011 ELSE 2012 END WHEN concat(date_s_month, date_s_day) >= DATE_FORMAT(CURDATE(), '%m%d') THEN 2011 END WHEN date_s_year is not null THEN date_s_year END , date_s_month , date_s_day

sr-ki
質問者

お礼

再度のご回答ありがとうございます。 御礼が遅くなってしまい誠に失礼いたしました。 ご教示いただいた内容を参考に、現在、仕様変更も視野に入れいろいろ検討いたしております。 ご丁寧なご回答ありがとうございました。

その他の回答 (2)

  • takubou05
  • ベストアンサー率52% (11/21)
回答No.2

各カラムの型を教えてもらえますか? varcharであれば0埋めされているかも教えてもらえれば、 SQLを作成できます。

sr-ki
質問者

補足

ありがとうございます。 全てのカラムはvarcharではなくtextです、質問に書かせていただいている桁でゼロ埋めしてある状態です。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

効率悪いし、すぐ破綻しそうな仕様のでこれはやめた方がいいです。 たとえば毎年行っている年越しイベントは表現できません。 やるなら、開始日と終了日はそれぞれdate型にし、 1日開催であっても同じ日をいれることです。 また毎年決まったものでも必ず、毎年分データをつくってください。 毎年分のデータを想定しても10年先までデータを作っておけばすみます。 (ある年だけ中止したりとかいろいろ用件がでてくるのでその対応のためにも) 以上を満たせば非常に単純なSQLで高速に処理することができます。 SELECT * FROM event WHERE CURDATE() < 終了日 ORDER BY 開始日,終了日

sr-ki
質問者

補足

ありがとうございます。 いろいろな事情からこの仕様になったようでして、このままの仕様でなんとか実装したいと思っていたのですが、やはり仕様変更も視野に入れてみます。

関連するQ&A