34

次の形式で何千もの日付があります。

2011-10-02T23:25:42Z(別名、UTC の ISO 8601)

このような ISO8601 日付を MySQL データベースに格納するには、どの MySQL データ型を使用すればよいですか? たとえばDatetimetimestampまたは何か他のものですか?

比較 (例: 2 つの日付/時刻間のレコードの取得) とクエリからの結果の順序付けに最適なのはどれですか? データベースが非常に大きい場合はどうなりますか?

そして、上記の PHP 文字列を MySQL ストレージ用に変換する最良の方法は何でしょうか? (date_default_timezone_set('UTC');まさか使われるとは?)

4

6 に答える 6

13

DateTime日付と時刻を格納するためにデータ型を使用できます。

関数を使用CASTして、そのような文字列を mysqlDateTime型にキャストします。

次に例を示します。

CAST("2011-10-02T23:25:42Z" AS DATETIME)

これにより、 が得られます2011-10-02 23:25:42

これがあなたを助けることを願っています。

于 2015-01-30T19:27:49.523 に答える
3

strtotime次の関数を使用して、日付を簡単に変換できますphp

date_default_timezone_set('UTC');
$date = '2011-10-02T23:25:42Z';//(aka ISO 8601 in UTC)
$time = strtotime($date); //time is now equals to the timestamp
$converted = date('l, F jS Y \a\t g:ia', $time); //convert to date if you prefer, credit to Marc B for the parameters

これで、ニーズに最も合ったものMySQLを使用するtimestampか、それに応じて日付を挿入するだけです。datetimeここでは、両方のタイプについて知っておくべき最も重要なことを説明します。


タイムスタンプ

  • '1970-01-01 00:00:01' UTC から '2038-01-09 03:14:07' UTC の範囲
  • タイムゾーン設定の影響を受けます。
  • 4 バイトのストレージ
  • on update current_timestampすべてのバージョンの列を許可します。
  • インデックスの方が早い
  • NULL可能なデフォルト値ではありません
  • 値は現在のタイム ゾーンから にUTC変換されて保存され、 から現在のタイム ゾーンに変換さUTCれて取得されます。

日付時刻

  • 「1000-01-01 00:00:00」から「9999-12-31 23:59:59」までの範囲
  • 定数 (タイムゾーンは影響しません)
  • 8 バイトのストレージ
  • バージョンの時点でのみ列の更新を許可する5.6.5

比較 (例: 2 つの日付/時刻間のレコードの取得) とクエリからの結果の順序付けに最適なのはどれですか? データベースが非常に大きい場合はどうなりますか?

私が述べた前のポイントによるとtimestamp、ストレージが小さく、インデックスが高速であるため、非常に大きなデータベースに使用する必要があります。これにより、比較のパフォーマンスが向上します。ただし、日付が前述の の制限に適合していることを確認する必要timestampがありますdatetime

ドキュメントstrtotime : http://php.net/manual/en/function.strtotime.php

mysql* そして、 DEPRECATED関数を使用しないように毎日繰り返し続けるSOの回答者のために、PDOまたはmysqli*挿入を行うときに使用してください。

http://php.net/manual/en/book.pdo.php

http://php.net/manual/en/book.mysqli.php

于 2015-02-03T01:24:02.213 に答える
0

datetime を使用した方がよい理由を次に示します。

  1. datetime を使用すると、mysql 側で日付操作を行うことができます-日、月の減算など
  2. データの並べ替えができるようになります。
  3. DB が巨大な場合 - varchar は HDD でより多くの場所を占めます
于 2011-11-08T08:21:45.563 に答える