![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
イベント情報をキーワード検索できるページを制作しており、下記テーブルからデータを取得したいのですが、日付関係の条件指定の方法が分かりません。
下記のような条件で取得したい場合どのようにすればよいでしょうか?(キーワード検索の部分はわかります)
テーブル 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
説明が分かりにくいかもしれませんが、アドバイスをいただければ幸いです。
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
再度のご回答ありがとうございます。
御礼が遅くなってしまい誠に失礼いたしました。
ご教示いただいた内容を参考に、現在、仕様変更も視野に入れいろいろ検討いたしております。
ご丁寧なご回答ありがとうございました。
No.2
- 回答日時:
各カラムの型を教えてもらえますか?
varcharであれば0埋めされているかも教えてもらえれば、
SQLを作成できます。
この回答への補足
ありがとうございます。
全てのカラムはvarcharではなくtextです、質問に書かせていただいている桁でゼロ埋めしてある状態です。
No.1
- 回答日時:
効率悪いし、すぐ破綻しそうな仕様のでこれはやめた方がいいです。
たとえば毎年行っている年越しイベントは表現できません。
やるなら、開始日と終了日はそれぞれdate型にし、
1日開催であっても同じ日をいれることです。
また毎年決まったものでも必ず、毎年分データをつくってください。
毎年分のデータを想定しても10年先までデータを作っておけばすみます。
(ある年だけ中止したりとかいろいろ用件がでてくるのでその対応のためにも)
以上を満たせば非常に単純なSQLで高速に処理することができます。
SELECT *
FROM event
WHERE CURDATE() < 終了日
ORDER BY 開始日,終了日
この回答への補足
ありがとうございます。
いろいろな事情からこの仕様になったようでして、このままの仕様でなんとか実装したいと思っていたのですが、やはり仕様変更も視野に入れてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) エクセルの数式で教えてください。 2 2022/12/23 14:57
- Access(アクセス) ExcelのVBAコードについて教えてください。 4 2023/01/20 09:44
- その他(Microsoft Office) エクセル 条件付き書式 日をまたぐ塗りつぶし 1 2023/01/13 18:00
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PostgreSQLのtimestamp型で時間...
-
MySQLで期間のUNIQUEってできま...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
MySQLで数字の値のもののみを取...
-
UPDATEで既存のレコードに文字...
-
【SQL】他テーブルに含まれる値...
-
ACCESS クエリーでソートの不具合
-
[materialized]マテリアライズ...
-
テーブル定義書(Oracle) 【IX】...
-
Accessで今日から5日後
-
ACCESSにおいてスキーマとは
-
固定長のデータをmysqlで取り込...
-
OracleとSQL ServerのSQL文上で...
-
オラクルのUPDATEで複数テーブル
-
右向き、左向きの速度が最大と...
-
ExcelのMatch関数のようなもの...
-
PL/SQLの初歩的な質問その2
-
csvデータ不要列の削除をbatフ...
-
CSVファイルを読み込んでテーブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PostgreSQLのtimestamp型で時間...
-
Access にて "mm:ss.0" 形式の ...
-
SELECT の仕方 (今月のデー...
-
MySQLで期間のUNIQUEってできま...
-
Excelの外部参照と書式設定につ...
-
予約システムでの時間の設計に...
-
英単語の意味
-
ご覧ください、ご参照ください...
-
該当レコードなしでエラーを発...
-
SQL 文 日付範囲を指定したレコ...
-
NASAで働くにはどうしたらいい...
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
スキーマ
-
sqlに記述できない文字
-
オラクルのUPDATEで複数テーブル
-
Accessで今日から5日後
-
timestampのデータはどのように...
-
UPDATEで既存のレコードに文字...
おすすめ情報