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

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

SQL文の書き方

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

  • sr-ki
  • お礼率68% (43/63)
  • MySQL
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • 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

  • Excelの数式について教えてください

    Excelの数式について教えてください カテ違いでしたらすみません Excelの数式にすいて質問です 福祉サービスの利用にかかわる仕事をしています 受給者証の支給開始日や、サービスの利用期間の管理をするため、表にまとめています セルB…サービス種別(機能訓練、生活訓練) セルG…利用開始日 セルM…経過月数 サービス利用期間 機能訓練…18ヶ月まで 生活訓練…24ヶ月まで 注)利用開始が4月1日からの場合、4月を1ヶ月目とする。利用開始が4月2日の場合、翌月5月を1ヶ月目とする これらを踏まえて、回答をいただきたいです Excelにて経過月数を表示させ、現在何ヶ月経過しているか・また、機能訓練18ヶ月、生活訓練24ヶ月を超えた場合、「終了」と表示させるため、セルMにこの様な数式を入力しています =IF(OR(IF(B2="機能訓練",IF(DAY(G2)=1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M")+1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M"))>18),IF(B2="生活訓練",IF(DAY(G2)=1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M")+1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M"))>24)),"終了",IF(DAY(G2)=1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M")+1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M"))) しかしこの状態では、セルGに利用開始日が入っていない時、セルMには「1328」と表示されてしまいます そのため、 =IF(G2="","",IF(OR(IF(B2="機能訓練",IF(DAY(G2)=1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M")+1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M"))>18),IF(B2="生活訓練",IF(DAY(G2)=1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M")+1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M"))>24)),"終了",IF(DAY(G2)=1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M")+1,DATEDIF(DATE(YEAR(G2),MONTH(G2),1),DATE(YEAR(NOW()),MONTH(NOW()),1),"M")))) というような式を入れましたが、エラーになります 出来たら新規で入力する列には、値が出ないようにしたいので、空欄にしておきたいのです どこが間違っているのでしょうか? アドバイスいただけるとうれしいです。宜しくお願いします

  • PHPでPOSTした入力日の日付の+1日を取得したいです。

    PHPでPOSTした入力日の日付の+1日を取得したいです。 POSTされた値は以下です。 年 $y_pre = $_POST['year']; 月 $m_pre = $_POST['month']; 日 $d_pre = $_POST['day']; 以下はPOSTされた値の加工です。 日付加工  $s_ymd_pre = mktime(0,0,0,$m_pre,$d_pre,$y_pre); 日付加工  $ymd_pre = date("Y-m-d",$s_ymd_pre); ここから+1日のデータを取得したいです。 どうぞよろしくお願いいたします。

  • VBA 日付型を8桁数値へ変換

    VBAの中で、Date型の日付をバッチファイルに渡す時に、8桁数値へ変換したいのですが、0埋めのやり方が分からずに困っております。 Date型 yyyy/mm/dd 8桁数値 yyyymmdd Private Sub cmdBSubmit_Click() Dim rc As Integer Dim sDate As Date Dim eDate As Date '開始日・終了日処理 sDate = DateAdd("d", -5, txtsDate) eDate = DateAdd("d", 5, txteDate) Debug.Print "----------------------" Debug.Print "開始日-5:" & sDate Debug.Print "終了日+5:" & eDate 'パブリック変数へ、日付格納 sDateP = Year(sDate) & Month(sDate) & Day(sDate) eDateP = Year(eDate) & Month(eDate) & Day(eDate) Debug.Print "----------------------" Debug.Print "開始日:" & sDateP Debug.Print "終了日:" & eDateP rc = MsgBox("開始日 : " & sDate & vbCrLf & _ "終了日 : " & eDate & vbCrLf & _ "抽出を開始します宜しいですか?", vbYesNo + vbQuestion, "確認") If rc = vbYes Then '集計バッチを実行 'MsgBox "実行" Call 抽出 Else '中止 MsgBox "中止" End If End Sub 'パブリック変数へ、日付格納 sDateP = Year(sDate) & Month(sDate) & Day(sDate) eDateP = Year(eDate) & Month(eDate) & Day(eDate) この書き方だと、月・日が一桁の場合、例えば「2013/01/01」だと、”201311”になってしまいます。 これを、"20130101"にしたいのですが、どう書けば宜しいでしょか? 最初から、8桁日付で入力すればよいのでしょうか、入力した日付の前後5日を自動的に増やす必要がある為に上記の仕様にしてます。

  • DATEDIF関数

    少し前にもDATEDIF関数の事で質問を出したのですが、 その作業中のことです。 開始日から終了日までの、期間月数を出すため、 =DATEDIF(N40-DAY(N40),DATE(YEAR(N41),MONTH(N41)+1,0),"M") という数式を入れています。 (N40が開始年月・N41が終了年月です) 年月のみの入力なので、開始年月は日を相殺し、終了年月はその月末を出すようにしてます。 で、大抵の値では上手くいくのですが、 開始年月 2000/9 終了年月 2004/4 の時だけ上手くいきません。 本当は「44」という値が欲しいのに、「43」になります。 どうやら終了年月が絡んでいるっぽいのですが、何が悪いのかが分かりません。 分かる方がいらっしゃったら教えて下さい。

  • ACCESSのSQLクエリについて質問です

    よろしくお願いします。 SQLのクエリで、 WHERE (((Year([日付01]))=Year(Date())) AND ((Month([日付01]))=Month(Date())+1)); と記述し、当月の翌月のテーブルを表示させていましたが、これだと12月の次は13月になってしまいます‥。 これをちゃんと翌年の1月が表示されるようにしたいのですが、どのようにすればよいかお教え頂けますでしょうか‥。 元々分かる方に教えて貰いながら作ったものなので、この文章だけで分かって頂けるか不安ですが、どうかよろしくお願いします。

  • if文の条件について

    2008年の09月30日までは「テスト」と表示し、それ以降はなにも表示しないようにしようと思い、以下のように作成してみました。 ---------------------------------------------------------- <?php $year = date('Y'); $month = date('m'); $day = date('d'); if($year == 2008 and $month == 09 and $day <= 30){ echo 'テスト';} ?> -------------------------------------------------------------- けれど、なにも表示されませんでした。 ためしに else{ echo 'hoge';} をつけ加えてみると、「hoge」と表示されました。 どうして「テスト」と表示されず、elseの「hoge」と表示されてしまうのでしょうか? ご教授のほど、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • php storetotime 最終日の前日

    たとえば、2か月前の最終日を求めるには date('Ymd', strtotime( 'last day of -2 month' )) で求められますが、その前日を求めるにはどうすれば良いでしょうか? date('Ymd', strtotime( 'last -2 day of -2 month' ))

    • ベストアンサー
    • PHP
  • 日付のオートフィル

    Sheet1(開始設定)B4=平成21年8月1日 Sheet2A1=DATE(YEAR(開始設定!$B$4),MONTH(開始設定!$B$4),DAY(開始設定!$B$4))→平成21年8月と表示させている。 Seet2B1=DATE(YEAR(開始設定!$B$4),MONTH(開始設定!$B$4)+1,DAY(開始設定!$B$4))→平成21年8月 以下Z1まで平成○年×月と表示させたい。 が、オートフィルが使えないのでMONTH(開始設定!$B$4)+1の+○をセルごとに 変えなければならない。 どうにかオートフィルを使える方法はありませんか? =EDATE(開始設定!$B$4,0)でも試しましたがオートフィルできませんでした。

  • 以下のSQLについて

    AccessMDBで、以下のテーブルがあったとします。 テーブル1 ID,NAME 1,おなまえ 2,名前 3,なまえ テーブル2 ID,DB1_ID,NAME,開始日,終了日 1,1,4月,2006/4/1,2006/4/30 2,1,6月,2006/6/1,2006/6/30 3,2,2006年度,2006/4/1,2007/3/31 このとき、以下のように出力したいのですが ID(オートナンバーと仮定),NAME,月,開始日,終了日 1,おなまえ,4月,2006/4/1,2006/4/30 2,おなまえ,6月,2006/6/1,2006/6/30 3,おなまえ,(null),(null),(null) 4,名前,2006年度,2006/4/1,2007/3/31 5,名前,(null),(null),(null) 6,なまえ,(null),(null),(null) 試しにクェリーを作ってみた所、(null)の値を手入力しなければいけないのですが nullをいれさせるようにするには、どのようにしないといけないでしょうか? #テーブルをいじることはできず、SQLのみで対処することを考えています。 SELECT テーブル1.NAME, テーブル2.NAME, テーブル2.START, テーブル2.END FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.ID=テーブル2.DB1_ID UNION SELECT テーブル1.NAME, テーブル2.NAME,テーブル2.START,テーブル2.END FROM テーブル1; よろしくお願いします。

  • php メールフォーム プルダウンメニュー

    現在PHPにてメールフォームを作成しております。 フォーム→確認画面→送信という順に作成しています。 フォームの段階でプルダウンを作成していますが、確認画面でフォームの内容(プルダウンの項目)を表示させようとしたときに、そのまま表示されず、1年4月1日などと表示されます。 例→フォームでは1990年04月10日としたら確認画面では1年4月1日。 1990年04月10日のように表示させたい。 確認画面でどのように記述したらよろしいでしょうか? フォームの記述は <?php if (count($_POST) > 0) { $year = @$_POST['year']; $month = @$_POST['month']; $day = @$_POST['day']; } print '<select name="year">' . "\n"; $start = date('Y') -20; $end = date('Y') -10; for ($i = $start; $i <= $end; $i++) { print '<option value="' . $i . '">' . $i . '</option>' . "\n"; } print '</select>年' . "\n"; print '<select name="month">' . "\n"; for ($i = 1; $i <= 12; $i++) { print '<option value="' . $i . '">' . $i . '</option>' . "\n"; } print '</select>月' . "\n"; print '<select name="day">' . "\n"; for ($i = 1; $i <= 31; $i++) { print '<option value="' . $i . '">' . $i . '</option>' . "\n"; } print '</select>日' . "\n"; ?> です。 確認画面のスクリプトは $year = isset($_POST['year']) ? $_POST['year'][0] : NULL; $month = isset($_POST['month']) ? $_POST['month'][0] : NULL; $day = isset($_POST['day']) ? $_POST['day'][0] : NULL; と<?php print h($year[0]) ;?>年<?php print h($month[0]) ;?>月<?php print h($day[0]) ;?>日 です。 またセッションも使用しております。 $_SESSION['year'] = $year; $_SESSION['month'] = $month; $_SESSION['day'] = $day; です。 ご教授お願いします。

    • ベストアンサー
    • PHP