
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を勉強する際にお勧めの書籍やウェブサイトなどありましたら是非教えて頂けると幸いです。
よろしくお願いします。
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- …
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) ' というように日付を指定して呼び出す事も可能ですので。
参考まで。
>入力されているデータを一旦全部呼び出して、変換してから再度データベースに書き込むのがいいと思います。
具体的なアドバイスありがとうございます。
参考になりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/01/10 09:15
- Excel(エクセル) エクセルの数式で教えてください。 2 2022/12/23 14:57
- Excel(エクセル) エクセルの数式で教えてください。 3 2022/12/22 17:29
- Access(アクセス) Access DTPickerの初期表示月を変えたい 1 2022/08/02 08:55
- Excel(エクセル) エクセルについて教えてください。 1 2023/03/03 08:38
- Excel(エクセル) エクセルに詳しい方 よく読んでからのご回答お願いします 外部からデータが来ますが、日付が202201 7 2022/06/29 16:15
- Excel(エクセル) エクセルの日付表示を変換するやり方をご存じの方は教えて下さい。 7 2022/12/28 15:43
- その他(エンターテインメント・スポーツ) 推しは、足りてますか? 2 2023/01/22 10:48
- Excel(エクセル) 下記エクセルの式がなぜこうなるのか理由が知りたいです。 6 2022/08/20 00:43
- Excel(エクセル) 現時点の年齢を算出して、その年齢と一致したセルを色付けしたい。 4 2022/06/23 17:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLでの売上集計
-
MySQLの日付データについて
-
RFC822形式での日時の取得
-
すいません、質問をさせて下さい。
-
PHP+MySQLで、日時を比較して抽...
-
開始日と期間で終了日を求める...
-
データベース(MySQL)にNULLと...
-
where文について
-
PHPでmySQLのデータベースを操...
-
3つのテーブルから情報一覧を...
-
SELECT文の加工(日付/時刻型)
-
phpPgAdminでテーブルが作成で...
-
php+mysqlでポータルサイトを作...
-
php mysql で1レコードをランダ...
-
phpMyAdmin: 256件目以降のデー...
-
在庫数の取得
-
重複レコードの表示について
-
mysql+php 日付別料金データで...
-
phpMyadminが重くてデータが削...
-
PHP5+MySQL5 CSVから、更新、追...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
csvをDBへ読み込んだら、NULLが...
-
ヒアドキュメントでSQLを書く事...
-
access → Oracleへのデータ移...
-
PHPでいいね機能を作りたいので...
-
OracleからAccessへのインポート
-
変数にNULLを代入したい
-
DB Error: no such field
-
カラムにデータがあるかないか...
-
MDB2エラーが対応出来ません。
-
phpでテーブルを作る際変数によ...
-
phpにて出欠登録管理を作成して...
-
Accessへ日付をINSERT
-
mysql+php 日付別料金データで...
-
データをDBからひっぱってき...
-
MySQLのテーブル選択について
-
クエリObjectをforeachで回す時...
-
php sqlite count 列数取得
-
会員番号等に利用するダブらな...
-
エクセルをMysqlに格納
おすすめ情報