dポイントプレゼントキャンペーン実施中!

イベント情報をキーワード検索できるページを制作しており、下記テーブルからデータを取得したいのですが、日付関係の条件指定の方法が分かりません。
下記のような条件で取得したい場合どのようにすればよいでしょうか?(キーワード検索の部分はわかります)

テーブル event
 date_s:開始日(Ymd形式の8桁 もしくは md形式の4桁)
 date_s_year:開始日の年(Y形式の4桁 もしくは NULL値)
 date_s_month:開始日の月(m形式の2桁)
 date_s_day:開始日の日(d形式の2桁)
 date_e:終了日(Ymd形式の8桁 もしくは md形式の4桁 もしくは NULL値)
 date_e_year:終了日の年(Y形式の4桁 もしくは NULL値)
 date_e_month:終了日の月(m形式の2桁 もしくは NULL値)
 date_e_day:終了日の日(d形式の2桁 もしくは NULL値)

 ※複数日に渡って行われるイベントには終了日が入っていて、単日のイベントの終了日はNULL値です。
 ※その年だけに行われる単発のイベントには年と月と日がすべて入っています。毎年決まった日に行われるイベントには月と日のみが入っており、年はNULL値です。

・検索対象は今日から1年先までのデータ
・開催中(開始日が本日以前で終了日が本日以降)のイベント → 開始日が今日に近いイベントという順番で並べたい。

MySQL:5.1.22-rc
PHP:5.2.5

説明が分かりにくいかもしれませんが、アドバイスをいただければ幸いです。

A 回答 (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
    • good
    • 0
この回答へのお礼

再度のご回答ありがとうございます。
御礼が遅くなってしまい誠に失礼いたしました。

ご教示いただいた内容を参考に、現在、仕様変更も視野に入れいろいろ検討いたしております。

ご丁寧なご回答ありがとうございました。

お礼日時:2011/05/16 16:39

各カラムの型を教えてもらえますか?



varcharであれば0埋めされているかも教えてもらえれば、
SQLを作成できます。

この回答への補足

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

補足日時:2011/05/13 16:35
    • good
    • 0

効率悪いし、すぐ破綻しそうな仕様のでこれはやめた方がいいです。


たとえば毎年行っている年越しイベントは表現できません。

やるなら、開始日と終了日はそれぞれdate型にし、
1日開催であっても同じ日をいれることです。
また毎年決まったものでも必ず、毎年分データをつくってください。
毎年分のデータを想定しても10年先までデータを作っておけばすみます。
(ある年だけ中止したりとかいろいろ用件がでてくるのでその対応のためにも)

以上を満たせば非常に単純なSQLで高速に処理することができます。

SELECT *
FROM event
WHERE CURDATE() < 終了日
ORDER BY 開始日,終了日

この回答への補足

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

補足日時:2011/05/13 16:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す