mysql,phpで日付型に曖昧な日付を並べる方法について

このQ&Aのポイント
  • 商品データベースサイトの日付型に曖昧な日付(2011年夏、2011年4月下旬など)を入力し、意味合いに基づいて並べる方法について質問します。具体的なイメージやテーブルの構造を示しました。
  • 質問内容はmysqlもしくはPHPを使用して、商品データベースサイトの日付型に曖昧な日付を入力し、意味合いに基づいて並べる方法を教えて欲しいものです。
  • 具体的なイメージとして、テーブルにセブン、タイタニック、パイレーツなどの映画タイトルと発売日を登録し、タイタニック、ファイトクラブ、セブンなどの順に並べる方法を知りたいです。
回答を見る
  • ベストアンサー

mysql,php。date型に3月上旬などをいれ

よろしくお願いいたします。 商品のデータベースサイトを運営しております。 発売日ごとに商品を並ばせているページがあります。 過去に発売したもの、発売日が決定しているものについては、 date型に日付を入れてDBに登録しているのですが、 発売日が若干曖昧なもの、(2011年夏、や2011年4月下旬など)の商品も今後登録し、 可能ならば意味合い的に並ばせればいいなあと思っています。 こういうことは、mysqlかphpをどういじれば実現できるのでしょうか? 下記に具体的なイメージを載せます。 もしお分かりになる方がいらっしゃいましたら、よろしくお願いいたします。 テーブル title , hatsubai セブン , 2010-7-30 タイタニック , 2005-2-5 パイレーツ , 2011年4月下旬 ファイトクラブ , 2008-3-14 トロイ , 2011-9-8 ナルニア , 2011年冬 吐き出したい並び(上と一緒) タイタニック , 2005-2-5 ファイトクラブ , 2008-3-14 セブン , 2010-7-30 トロイ , 2011-9-8 パイレーツ , 2011年4月下旬 ナルニア , 2011年冬 ※自分が作っているテーブルはもうちょっと複雑なので、 新しいカラムを追加してそこにidをつけて並ばせる、というのではなく、あくまで日付で並ばせたいです。 いま吐き出しているphpは、 while ($row = mysql_fetch_array で出しています。 曖昧な表現や、ここがわからない、などあればご指摘ください。 よろしくお願いいたします。

  • MySQL
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • duron
  • ベストアンサー率77% (73/94)
回答No.1

カラム[hatsubai]がDATE型である以上、日付しか入れることができないため 現状の構成のままでは実現不可能であるとおもいます。 少なくとも「あいまいな日付」であるというデータをなにかしら持つ必要があるとおもいます。 カラムを増やさないとすれば[hatsubai]をDATETIME型にし 時間の部分をあいまいな日付の分類に使ってみてはどうでしょうか? たとえば 0:00はあいまいでない日付 01:00は1月 01:10は1月上旬 01:20は1月中旬 01:30は1月下旬 02:00は2月 ・ ・ 12:00は12月 12:10は12月上旬 12:20は12月中旬 12:30は12月下旬 13:00は春 14:00は夏 15:00は秋 16:00は冬 などというようにして 読んできた日時データから表示する発売日をPHP側で決定する、という感じで。 タイタニック , 2005-2-5 ファイトクラブ , 2008-3-14 セブン , 2010-7-30 トロイ , 2011-9-8 パイレーツ , 2011年4月下旬 ナルニア , 2011年冬 でしたら タイタニック , 2005-02-05 0:00 ファイトクラブ , 2008-03-14 0:00 セブン , 2010-07-30 0:00 トロイ , 2011-09-08 0:00 パイレーツ , 2011-12-31 04:10 ナルニア , 2011-12-31 16:00 のように登録するよう工夫をする。 でもこれはっきり言っていろいろ考えて作る必要があるので大変だとおもいます。 特に2011-9-8より後に2011年4月下旬のものが来るようにするために4月なのに12月で登録してますし。 表示する日付にできるだけ近い値で登録できるように表示順を考える必要があると思います。 私が日付の登録ルールを決めるとしたら 1.あいまいでない日付は0:00で登録(2011年4月1日->2011-04-01 00:00) 2.X月上旬はその月の最終日の1:00で登録(2011年2月上旬->2011-02-28 01:00) 3.X月中旬はその月の最終日の1:10で登録(2011年3月中旬->2011-03-31 01:10) 4.X月下旬はその月の最終日の1:20で登録(2011年4月下旬->2011-04-30 01:20) 5.X月はその月の最終日の2:00で登録(2011年2月下旬->2011-02-28 02:00) 6.春は5月31日の3:00で登録(2011年春->2011-05-31 03:00) 7.夏は8月31日の3:10で登録(2011年春->2011-08-31 03:10) 8.秋は11月30日の3:20で登録(2011年春->2011-11-30 03:20) 9.冬は次の年の2月最終日の3:30で登録(2011年冬->2012-02-29 03:30) という感じにするでしょうか(四季は区切りをどこにするかで変わるでしょうが) 日時でソートすれば 2011-01-01 2011-01-31 2011年1月上旬 2011年1月中旬 2011年1月下旬 2011年1月 ・ ・ ・ 2011-05-31 2011年5月下旬 2011年春 2011-06-01 ・ ・ というように並べ替えられます(もちろん時刻を見て出力フォーマットを選択する必要がありますが) ちょっと長々と書きすぎてわかりずらいかもしれません。 少しでも参考になればよいですが。

hasu23
質問者

お礼

duron様 ご回答ありがとうございます! また、お返事遅くなりまして申し訳ありませんでした。 いただきましたご回答の考え方、非常に参考になりました!ありがとうございました! これを元に落とし込んでみたら、無事にできました。 細かなところはいまブラッシュアップしている最中ですがduron様のご助言あってこそでした。 ありがとうございました!

関連するQ&A

  • MySQLのdate型をphpで○年○月○日と表示したい

    MySQL5+PHP5の環境でMySQLのフィールドにdate型で2008-09-25のように本の発売日がデータが格納されています。 PHPで2008-09-25を2008年9月25日というように表示したいのですが、どのような関数を使えばいいのでしょうか。 やりたいことは、本の発売日をphpのフォームからMySQLに格納して、2008年9月25日のように自由に整形表示したいです。 また、月別のデータ表示や日付の計算なんかもしたいのですが、このような場合、MySQL側をdate型にしないで他の型にしたほうがいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP+MySQLで

    PHPとMySQLにて、 データベースのテーブル[買い物]に、 「野菜」「日時」という属性を用意しておき、そこに (にんじん)(2006-10-31 09:00) (かぼちゃ)(2006-11-01 10:21) (たまねぎ)(2006-10-21 11:45) (もやし)(2006-12-22 14:00) が格納してあります。 ここから日付が、例えば、2006年の10月の行を抜き出すにはどうしたらよいのでしょうか? $y=$_GET['year'] $m=$_GET['month'] $d=$_GET['day'] として、年月日を得ます。 $y年の$m月分のデータを取得したいのですが、よく分かりません。 select * from 買い物 where 日時>$y-$m-1 and 日時<$y-$m-31 のような感じになるのでしょうか? どなたかよろしくお願いします。 MySQL4.4.4です。

    • ベストアンサー
    • PHP
  • PHPでのMySQLデータ抽出でおかしな現象

    お世話になります。 是非、知恵を貸していただきたく投稿させていただきました。 PHPにてMySQLのデータを持ってくる際におかしな現象がおきております。 登録日(entry_date)をデータ型datetime持つテーブルがあります。 そのテーブルに対し、以下のSQL文を発行し実行したところ、phpmyadminでは正常に動作するのに、PHPではある日付でのみ結果がおかしいという現象が発生しました。 ●正常パターン(2016-01) SELECT COUNT(*) AS cnt FROM テーブル WHERE DATE_FORMAT(entry_date, '%Y-%m')='2016-01'; phpmyadmin上で動作させた結果 cnt --- 155 phpで動作させた結果 Array ( [0] => Array ( [cnt] => 155 ) ) ●異常パターン(2017-01) SELECT COUNT(*) AS cnt FROM テーブル WHERE DATE_FORMAT(entry_date, '%Y-%m')='2017-01'; phpmyadmin上で動作させた結果 cnt --- 19 phpで動作させた結果 Array ( [0] => Array ( [cnt] => 0 ) ) 異常になるのは、何故か日付指定が「2017-01」の場合のみで、他の日付では問題ありません。 「2017」年のほかの日付はまだ存在しないので、そちらは確認できないのですが。 PDOが駄目なのかと思い、PDO以外でも実行してみましたが、結果は変わりませんでした。 ちなみに、SQL文で、DATE_FORMATを利用せずに、 entry_date LIKE '2017-01%' や entry_date between '2017-01-01 00:00:00' and '2017-01-31 23:59:59' なども実行してみたのですが、結果は一緒でした。 検索日付で動作がおかしくなるなんてことがあるのでしょうか・・・ <<環境>> さくらスタンダード mysqlバージョン:5.5 phpバージョン:5.3 もし何か思い当たること等ございましたら、ご教授願いたく思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • mysqlでdate型のカラムに今日から1年分の日付を挿入するSQLは

    mysqlでdate型のカラムに今日から1年分の日付を挿入するSQLは書けますでしょうか ・テーブル  T_TEMP ・カラム  M_DATE (DATE型) ・SQL  insert into T_TEMP (select ???); 以上、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 在庫管理などのMySQLのカラム名の付け方

    お世話になります。 MySQL5.6使用です。 MySQLでのカラム名の付け方について教えてください 現在、各レコードが商品ごとで、カラムが日付けごとのテーブルがあります。 各値は、その日の在庫総数が入力されています。     2016-12-01 2016-12-02 2016-12-03   ・・・・・  商品A  100     90     70 商品B  100     80     60 商品C  100     70     50 前日からの在庫数の変化や 任意の期間の在庫数の変化をデータとして取りたいと思っています。 例えば、商品Aでいうと 12月2日は、前日と比べて10個減少。 12月3日は、前日と比べて20個減少。 12月3日は、2日前と比べて30個減少。 12月1日~12月3日までの各商品の在庫数の変化の値やグラフ といった感じです。 MySQLで数値を取り出す時のカラム名を指定する場合に、 上記のようなカラム名だと、日付を指定(カラム名を入力)する時に 「2016-12-01」「2016-12-02」「2016-12-03」といった表示形式に 変更しないといけないと思いますが、 通常、このような場合、どのようなカラム名を利用されいるのでしょうか? 個人的には、シリアル値のテキスト文字で カラム名を持った方が、後々に、利用勝手が良さそうな気がしています。 例えば、エクセルのVBAから MySQLのデータを取り出すと想定したとき、 VBA側でDate関数などを利用し、 テキスト文字をformat関数で修正すれば、同じことかもしれませんが 一般論的にどのようなカラム名が利用されるかが知りたいです。 ---- また、少し別件となりますが、 このようなテーブルの持ち方は良くない方法でしょうか? このような形でテーブルを持つと、 カラムが理屈上は永遠に増えることとなります。 テーブルの構成の仕方なども アドバイスいただける幸いです。 どうぞよろしくお願いします

    • ベストアンサー
    • MySQL
  • MYSQLのDATE型をVB側で変換したい。

    いつもお世話になっております。 以前、こちらでMYSQLサーバでの日付を格納するDatetypeについてご質問させていただきました。 MYSQLとVB6.0についての質問です。 フォームを開いた際、コンボボックス「cmb_date1」には 本日から数えて4日前の日付を「yyyy年mm月dd日(aaa)」形式で表示させ、 Private Sub Form_Load() 'コンボボックスに今日~4日前の日付を表示    Dim day As Integer    For day = 0 To 3     cmb_date1.AddItem Format(Date - day, "yyyy年mm月dd日(aaa)")   Next    cmb_date1.Text = cmb_date1.List(0) End Sub それで、コンボボックス「cmb_date1」内の日付を選択し、 フォーカスを喪失した際、MYSQLサーバへ接続し、 テーブル「test」のフィールド「date」を検索し、その日付に該当するデータを フォームのラベル「Label1、Label2」へ表示する処理をしています。 Private Sub cmb_date1_LostFocus()    Dim myADOcon As ADODB.Connection    Dim myrec As ADODB.Recordset    Set myADOcon = New ADODB.Connection    Set myrec = New ADODB.Recordset    myADOcon.Open "Driver={MySQL ODBC 3.51 Driver};SERVER = サーバ名;DATABASE=DB名;  UID=ユーザー名;PWD=PASS;STMT=SET CHARACTER SET cp932; "    myrec.Open "select * from test where date='" + cmb_date1.Text + "';", myADOcon     Label1.Caption = myrec.Fields("test1").Value     Label2.Caption = myrec.Fields("test2").Value End Sub そこで質問なのですが、 上記のコーディングですと、当然ながら2009年10月14日(水)のレコードが存在しないため 『実行時エラー'3021' BOFとEOFのいずれかがTrueになっているか、または現在のレコードが 削除されています。要求された操作には、現在のレコードが必要です。』 が表示されます。 MYSQLサーバには「DATE型」で格納している日付「2009-10-14」を、 フォーム上で呼び出す際、コンボボックス「2009年10月14日(水)」を選択しても、 日付「2009-10-14」のデータを呼び出せる方法はございませんでしょうか? 今後、日付の抽出処理などを行いたいため、DatetypeはDATE型のままにしておきたいのですが・・・。 よろしくお願いいたします。

  • 月の中でわけて集計(Excel)

    言葉では表しにくいのですが 商品名 日付 数量 ABC  1/3  5個 DEF  1/4  1個 DEF  1/15  8個 ABC  1/23  6個 と言うデータがあるとします。 これを 10日までに売れた物は「上旬」 20日までに売れた物は「中旬」 それ以降の日で次の月までに売れた物は「下旬」 に割り振りたいと思っています。 つまりは↓のような感じです。 商品名 上旬 中旬 下旬 ABC  5個      6個 DEF  1個   8個 方法は関数でもピボットテーブルでもなんでもいいのですが、 エクセルで実現したいと思ってます。(バージョンは2000です) どうかご教授お願いします。

  • パイレーツ・オブ・カリビアン5枚セットについてです

    ディズニー映画の パイレーツ・オブ・カリビアンですが、 公開から時間が経ち、かなり安価な物が発売されたみたいですね。 「パイレーツ・オブ・カリビアン ブルーレイ 5ムービー・コレクション 」 こちらの商品ですが、 ディズニーの公式ページを見ると、 MovieNEX CLUBという星のマークが書いてあるので、 MovieNEXのデジタルコピーが使えそうなのですが、 いざ商品を購入するサイト、例えばアマゾンだったり楽天だったりに行ったら、そのMovieNEXの事は何も書かれていないので不安です。 どなたか実際に買った方いらっしゃいませんか? そして、その商品にはMovieNEXのマジックコードは付いていますか?

  • ロッテの冬みかんガム

    冬期限定だとは思うのですが、11月下旬頃から発売になった ロッテの冬みかんガムが気に入ってます。しかし、どこで購入したのか忘れてしまい 今になって探しているのですが どこにも売っていません。セブンイレブン・サンクス・ローソン・イトーヨーカ堂・ドンキホーテなどあたってみたのですが売っていませんでした。どなたか 販売している場所を(できればネットではなく)知っていたら教えて下さい。

  • SQLで、指定日に一番近いレコードだけ抽出

    Linuxサーバーで、MySQLを使っています。 商品テーブルの中で、 同じ商品のレコードが複数あります。 (例です。本来ならそんなつくりのテーブルは作らないです。) その多数のレコード中に、日付項目があります。 そこから、 1)商品毎に、2)指定日に、3)一番近い過去未来の日の、4)レコードだけを抽出するには、 どのようなSQL文を書けばよいでしょうか? 1.過去に複数ある日付の中から、指定日に、一番近いレコード。 2.未来に複数ある日付の中から、指定日に、一番近いレコード。 3.同一商品レコードは、複数抽出されない。

    • ベストアンサー
    • MySQL