• ベストアンサー

MySQLの日付データについて

PHPでMySQLから日付データを表示しようとしているのですが、日付フィールドの値をvarcharにしてしまいました。 このような状況下での質問なのですが、varcharフィールドに2006年1月1日と2006年2月1日と2006年11月1日がある場合、PHPで日付データを表示するとこのような順番で表示されてしまいます。 2006年1月1日 2006年11月1日 2006年2月1日 下記のようなカレンダー順の表示にするにはどのような方法があるでしょうか? 2006年1月1日 2006年2月1日 2006年11月1日 また、下記の質問と回答を拝見したのですが、日付データはタイムスタンプで処理するのが一般的なのでしょうか? http://oshiete1.goo.ne.jp/qa1396724.html その場合、フィールドタイプをDATEにしておいて、PHPからMySQLに書き込む際はどのような形式が正しいのでしょうか? 2006/1/1のまま書き込んでも自動的にタイムスタンプに変換してくれるのでしょうか。 最後に私のような初心者がMySQLを勉強する際にお勧めの書籍やウェブサイトなどありましたら是非教えて頂けると幸いです。 よろしくお願いします。

  • yes87
  • お礼率74% (29/39)
  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.1

文字で格納する場合は、月日をそれぞれ2桁で表さないと、日付順のソートはできません。 >カレンダー順の表示にするにはどのような方法があるでしょうか? DB格納時に、'2006年01月01日'と月日を必ず2桁にしておくか、検索時(あるいはその後)に'月'や'日'を文字列サーチして、月日が1桁なら'0'を文字結合するといった方法が考えられます。 >日付データはタイムスタンプで処理するのが一般的なのでしょうか? 「何を管理するか」です。 誕生日などのデータであれば、時刻は必要ありません。 更新履歴などのデータであれば、同じ日に2回以上更新されることがないなら日付だけでもいいだろうし、時刻が必要な場合もあるでしょう。 MySQLのtimestamp型は、特殊なので注意が必要です。多くのRDBMSでは、timestamp型に利用者側が取得した日時を格納できます。しかし、MySQLでは、MySQL側が勝手に値を取得して格納します。利用者側で取得した日時を格納するには、datetime型を使う必要があります。 今回のように日付だけ管理できればいいなら、date型で十分でしょう。 >フィールドタイプをDATEにしておいて、PHPからMySQLに書き込む際はどのような形式が正しいのでしょうか? 文字形式で、'yyyy-mm-dd'といった形式で格納します。 例を示すと、以下のような感じです。 create table t1 (hiduke date); insert into t1 values('2007-6-1');

参考URL:
http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-types.html
yes87
質問者

お礼

timestamp型が一般的というわけでもないんですね。 参考になりました。 ありがとうございました。

その他の回答 (1)

回答No.2

varcharでは文字列として判断するので、ソートは難しいかもしれませんね。 入力されているデータを一旦全部呼び出して、変換してから再度データベースに書き込むのがいいと思います。 うっかりテーブルが無くなっては困るでしょうから、新しいテーブルに書き込むようにした方が良いですね。 変換は正規表現を使えば簡単だと思います。下記は文字列を数値配列にする例です。 $dstr = "2006年1月1日"; if(preg_match("/^([0-9]+)年([0-9]+)月([0-9]+)日/i",$dstr, $matches)){ print_r($matches);//Array ( [0] => 2006年1月1日 [1] => 2006 [2] => 1 [3] => 1 ) } > 日付データはタイムスタンプ型が一般的か? 日付データはTIMESTAMP型(YYYYMMDDHHMMSS)で、というのはそれほど一般的では有りません。PHP側で抽出、変換が案外面倒だからです。文字通り、タイムスタンプなので、自動的にログを残す、と言う事に主眼が置かれます。 日付にはDATE型(YYYY-MM-DD)があります。恐らくこれが一番一般的でしょう。その他、時間も追加した、DATETIME型(YYYY-MM-DD HH:MM:SS)もあります。 私がよく使うのは、数値のINT型にしておいて、mktime()等で作ったUNIX TIMEを格納する事です。データベースを変えた時等にも汎用性が有り(日付型はデータベースによって仕様がかなり違う)、しかもPHPからの呼び出しが楽です。 呼び出したデータを簡単にフォーマット出来ますし(例 date("Y-m-d",$data)、date("Y年m月d日 a h 時",$data) )、呼び出す場合も d >' mktime(0,0,0,$m,$d,$y) ' というように日付を指定して呼び出す事も可能ですので。 参考まで。

yes87
質問者

お礼

>入力されているデータを一旦全部呼び出して、変換してから再度データベースに書き込むのがいいと思います。 具体的なアドバイスありがとうございます。 参考になりました。 ありがとうございました。

関連するQ&A

  • mysql+php 日付別料金データで最安値の取得

    お世話になっております。 phpで、mysqlに日付毎料金の月の最安値を求めたいのですが、方法が思いつきません。 mysql  データベース名:ryoukin フィールド名:from(varchar(8)) 20061001 フィールド名:to(varchar(8)) 20061220 フィールド名:tariff(varchar(8)) 600 ・サンプルデータです 20061001 20061218 600 20061219 20070115 590 20070116 20070331 570 欲しい答え 10月600 11月600 12月590 1月570 2月570 3月570 バージョンは社外の方に設定してもらっているのでよく分からないのですが、php2.??だったかと思います。 もし、カテゴリーがmysqlならば、再度投稿し直しますのでご指示下さい。 よろしくお願いします。 例2) A B C 20061001 20070115 300 20070116 20070117 400 20070118 20070331 570 欲しい答え 10月300 11月300 12月300 1月400 2月570 3月570 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 取り出した日付の表示

    phpにてDBに格納されている日付データを取り出した際にデフォルトで "2007-06-04"のように表示されてしまいますが、これを "07/06/04"や"07.06.04"のように表示するにはどうすればよいのでしょうか? MySQLのフィールドタイプはdateに設定しています。 print date(Y/m/d,"$row["日付フィールド"]");とやるとなぜか、 "1970/01/01"と表示されてしまいます。 普通に、print $row["日付フィールド"]");とやると 2007-06-04と出てしまいます。 どうぞ宜しくお願いします。

    • ベストアンサー
    • PHP
  • timestampの日付の表示変換

    Mysqlのデータベースの中にある フィールド名: date_time 種別: timestamp を下記のPHPコードですると、 echo $row['date_time']; 下記のように表示されます。 2008-02-04 00:00:00 これを、Monday, February 4, 2008 と表示させたいのですが、 どのように日付表示を変換すればよいのか分かりません。 どなたか教えてもらえますか? 宜しく御願いします。

    • 締切済み
    • PHP
  • 日付処理について

    いつもお世話になってます。 環境はPHP5のMYSQLです。 DBに持っている登録日付から、ライセンスの期限を チェックするようなロジックを書きたいのですが 例えば変数や定数に「1」を与えたらDBの登録日から 1週間後、「2」なら2週間後のタイムスタンプを算出 するようなことは出来ますか? それから週単位ではなく、月単位や年単位など。 DBの日付は、タイムスタンプで持っています。 説明がちょっとうまくないので、足りないところは ご指摘頂ければ、補足します。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 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 5.1.6 MySQL 5.0.45 で作成したアンケートフォームがあるんですが、フィールドの中に日付を設けています。PHPで作られた集計画面をダウロードすると日付が 2.00901E+13 となります。 エクセルで日付表示にしても####になります。日付を表示するにはどうしたらいいのでしょうか?

  • 日付の計算方法(1970年以前のデータを含む)

    過去の日付のデータがあって、今日までのの経過年月日を求めたいです。 (例)  データ 1980年1月5日  本日が2004年2月6日なので、求めたい結果は24年1月1日 日付のデータには1970年以前のデータも含まれるためタイムスタンプ(グリニッジ標準時)が使用できません。 関数などを使って簡単に求める方法はあるのでしょうか? どのようにしたら求められるかわかる方教えていただけませんでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpとmysqlで抽出

    Mysqlに下記のようにデータがあります。 そこで、このデーター(日付)を 2013年1月1日(2件) 2013年1月2日(1件) 2013年1月3日(1件) 2013年1月5日(2件) のように抽出、集計したいです。 いろいろ考えましたが、ピンときませんorz どうすれば宜しいですか? お願いします。 Mysqlのデータ +--+---+ |ID |Dat| +--+--+ |1 | 20130101| +--+--+ |2 | 20130101| +--+--+ |3 | 20130102| +--+--+ |4 | 20130103| +--+--+ |5 | 20130105| +--+--+ |6 | 20130105| +--+--+

    • ベストアンサー
    • PHP
  • MYSQLで月ごとの集計をおこないたい

    こんばんは。MYSQLのTABLE_Aに下記の3つのフィールドがあります。 日時(DATE),商品名(VARCHAR),売上(INT) 2010/01/01,商品A,100 2010/01/30,商品B,200 2010/03/10,商品C,300 2010/03/20,商品D,400 最終的に欲しいのは、1月は1月の集計(300)、3月は3月の集計(700)など、月でまとめたいと思っています。 groupでまとめるにも日付まではいっているので、月でまとめるにはどうしたらいいのか悩んでいます。よろしくお願いします。利用MYSQLは5.5です。

    • ベストアンサー
    • MySQL
  • MySQLでデータを時間範囲で抽出したい

    mysqlでテーブルから、日付データが1ヶ月以内でかつ7時から8時までのデータを抽出する方法がわかりません。 テーブル内のtimeカラムにはタイムスタンプ型で日付が入っています。 time「2012-06-04 07:14:38」 time「2012-05-04 10:14:38」 time「2012-05-04 08:14:38」 time「2012-05-04 13:14:38」 SELECT * FROM table WHERE time >= DATE_ADD(NOW(),INTERVAL -1 MONTH) で1ヶ月以内のデータは抽出できたのですが、さらに7時から8時までのデータを抽出する方法が分からずかなり困っています。 どなたかご教授お願いいたします。

専門家に質問してみよう