私は通常、PHPのtime()
関数をMySQLデータベースに使用して整数を格納しています。これは、MySQLの日付形式を使用するのではなく、簡単に取り除くと操作しやすいからですが、これには何らかの欠点がありますか?MySQLの日付またはPHP時間?
答えて
範囲:
明らかな欠点が常にあります:あなたが保存できる範囲は限らフラン1970年である2038年にあなたがこの範囲外の日付を格納する必要がある場合は、一般的に別のものを使用する必要がありますフォーマット。この適用が生年月日のどこにあるのかが分かった最も一般的なケースです。
可読性:
私は人々がデータを解釈するのが容易であること、組み込みの日付タイプのいずれかにそれを使用することを選択したことを最も重要な理由だと思います。単純な選択を行い、応答をさらにフォーマットすることなく値を理解することができます。
インデックス:
日付タイプを使用するには良い技術的な理由は、それがUNIXタイムスタンプがないことをいくつかのケースでは、インデックス付きのクエリを可能にすることです。次のクエリを考えてみましょう:mydate_fieldは、ネイティブの日付型であり、フィールドにインデックスがある場合
SELECT * FROM tbl WHERE year(mydate_field) = 2009;
、このクエリは、実際の関数呼び出しにもかかわらず、インデックスを使用します。これは、mysqlがこのようなフィールドで関数呼び出しを最適化できる唯一の時間です。タイムスタンプフィールド上の対応するクエリは、インデックスを使用することはできません。
あなたは少しそれについて考える場合SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009;
は、しかし、それを回避する方法があります。このクエリは、同じことを行い、そしてはインデックスの最適化を使用することができます:
SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01");
計算:
は一般的に、私は欠点にもかかわらず、UNIX時刻として日付を格納します。これは実際にそれがメリットに基づいているのではなく、むしろ私がそれに慣れているからです。私はこれがいくつかの計算を単純化するが、他の計算を複雑にすることが分かった。たとえば、1か月あたりの秒数が異なるため、UNIXのタイムスタンプに月を追加することは非常に難しいです。これはmysqlのDATE_ADD()関数を使うと非常に簡単です。しかし、私はほとんどの場合、計算を実際に単純化すると思います。たとえば、過去2日間などの投稿を選択することはよくあることです。それはおそらく好みの問題だ
SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;
が、私は個人的なDATE_SUBとしての機能の構文をremberすることよりも、この迅速かつ容易に見つける:フィールドは、UNIXタイムスタンプが含まれている場合は、この単純に行うことにより、容易に行うことができます()。
タイムゾーン:
Unixのタイムスタンプは、タイムゾーンのデータを格納することはできません。私は単一のタイムゾーンを持つスウェーデンに住んでいるので、これは本当に問題ではありません。しかし、あなたが複数のタイムゾーンにまたがる国に住んでいると、大きな痛みになる可能性があります。
私は同じことをしていましたが、今はMySQLのDateTimeとして保存しています。データベースの生データを見ると、簡単に解釈できるからです。
それ以外の場合は、UNIXタイムスタンプを使用しない他の言語(PHPのように)でデータを扱う方が簡単かもしれませんが、実際にはどちらかといえば大きな違いはありません。
1つの欠点は、SQL関数を使用してこれらの日付を操作してクエリすることができないことです。あまりにも悪くないのですが、あなたのような機能が内蔵され、いくつか失うことになります
:
はdateColumn =のgetDate()TABLE1から選択* - 30
使用日時をできれば!
私は考えることができます:
*別の非PHPアプリケーションでデータベースを使用する必要がある場合、これは読みにくい形式になります。
*これらの日付にSQLベースの作業を行いたい場合(たとえば、月の追加や特定の年のすべての値の取得など)、これはもっと難しくなります。
にint(10)
int
を変更することができ、固定されていません。 –
若干の細部の喪失。 MySQL Datetime変数は非常に正確です。
また、データベースの日付を比較する必要がある場合、日付形式には使用できない組み込み関数がいくつかあります。
DATETIMEがより正確であるというあなたの主張の参照を見たいと思います。 –
あなたはより正確なtime()関数を意味しますか? 1)http://be2.php.net/manual/en/function.time.phpと2)http://dev.mysql.com/doc/refman/5.1/en/datetime.html Time()に行く次に、MySQLのDateTimeはマイクロ秒になります。 – KdgDev
UNIXタイムスタンプには、保存可能な日付の範囲に関して明らかな制限があります。
また、常にDATETIME
フィールドを使用しています。 SQLを使用してDATEの計算を多く行うことができるので、PHPを一切使用せずにDATEDIFF
のような有益な情報を現在から保存されている日付まで引き出すことができます。
は多くの欠点があります:精度の
- 不足。 UNIXの時刻は2番目の日付にのみ正確で、通常の32ビット整数を使用する場合は1901-12-13と2038-01-19の日付の間です。
- クエリには組み込みデータベース関数を使用できません。あなたが
time_t
が必要な場合は、コード内のいずれかに変換するのは簡単です、あなたはタイムゾーン
を保存することはできません
テーブル定義でMySQLのタイムスタンプの自動更新句を定義できます。
http://dev.mysql.com/doc/refman/5.0/en/timestamp.html
スケーラビリティの理由から、UNIXのタイムスタンプを使用する方がよいと思います。
利点:
- は必ず
UTC
タイムゾーン(複数のタイムゾーン間でのサーバーを持っている場合、変換が不要な)に保存されています。 - アプリケーションは、それらを優先タイムゾーンに変換します(これは、可能な限り最後のレベルで1回だけ発生します)。
- 文字列ではありません(整数と比較して膨大です)。
- 少ないデータベース計算(
created
<19345345345-24 * 60 * 60のようなものは1回計算されます)。
編集: MySQLタイムスタンプは内部的に文字列として保存されませんが、データベースから引き出されると文字列に変換されます。 DATETIME
タイプはMySQL
で修正されていません。つまり、データベースに日付を入力すると同じ結果が得られます。
異なるタイムゾーンのウェブサイトに訪問者がいる場合、整数 - >文字列の代わりに文字列 - >文字列のように日付を変換する必要があります。 いくつかの国では、日付は単なる数値ではありません(たとえば、フランスではMardi 15 mai 2012ですが、PHPやJSでそれを行うのが好きです。 プラス、他の国でのサーバへの移行がない場合は頭痛
フェイク欠点:。
- 私はUnixのタイムスタンプの限定された範囲は、実際に限定されるものではないと信じているタイムスタンプがあります。データベースの整数なので、サイズを調整することができます。デフォルトでは、
unsigned
の整数はint(10)
で、最大で4294967295
、それの限界はそう、我々は簡単にすべての一般的な言語が内蔵されているほとんどエポックタイムのサポートint(16)
bigint
私は実際に内部的に文字列として格納されているとは思わない。そして、どのようにDBの計算がより少ないのかわかりません... 'date_add(my_date、interval 2 months)'は一度だけ計算されるべきですが、とにかくPHP側で行うことができます。タイムゾーンのことについてはわかりません... MySQLのタイムスタンプにタイムゾーンが埋め込まれているのですか、データベースごとにグローバルなのでしょうか? – mpen
MySQLでは、これらはUTCとして保存され、クライアントのタイムゾーンのために引き出されます。 MySQLから[Documentation](http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html) "TIMESTAMPカラムの値は、現在のタイムゾーンからストレージのためにUTCに変換され、 UTCから現在のタイムゾーンまで取得することができます。 " –
さて、私は今あなたのポイントを見ます。私はあなたがそれをPHP側に変換したい場合にMySQLを設定すると、タイムゾーンが問題になるとは思わないが、string-> int-> string最適化は有効な点ですが、大きな費用はかかりません。あなたは何ページ、おそらく100の日付を解析していますか? – mpen
- 1. PHPの日付();時間
- 2. PHP間違った日付/時刻
- 3. php/mysqlデータベースからのライブ日付時間カウントダウン問題
- 4. MySQLの時間/日付計算
- 5. MySQL検索日付と時刻の間
- 6. PHPの日付と時間のクエリ
- 7. 日付のない日付からPHPなしの時間
- 8. MySQLの日付フィールドのオプションの月または日PHP
- 9. 日付の間のMySQLの日付
- 10. 日付から抽出時間SQL PHP
- 11. php getdate返された日付は2時間です
- 12. MySQLの日時デフォルトの時間間隔
- 13. PHP、MySQL; GROUP BYは日時
- 14. PHPを使用して日付時間に時間を追加
- 15. CodeIgniter日付または日付時刻
- 16. 日時からの時間付きPHPの表示日時:dd/mm/yy
- 17. のMySQL - 日付/時刻
- 18. PHP MYSQLの日付形式
- 19. PHP、日付、MySQLのタイムゾーン...?
- 20. MySQL、PHPの日付関数
- 21. MYSQL PHPの日付フィルタ
- 22. PHP現在の日付、昨日DateTime()に基づく時間。
- 23. 私は、PHPのmysqlは日付
- 24. PHPのインクリメンタル日MySQLの日付
- 25. 日付と時間の間にテキストを追加する - PHP
- 26. MySQLまたはPHPでの日付の使用
- 27. MySQLの私は、時間との二つの日付を比較したい2つの日時フィールド
- 28. 日付ピッカーからmysql/phpまでの奇妙な日付フォーマット
- 29. PHP条件付き日付処理 - 時間と日付を比較する
- 30. PHPまたはMySQLで日付順(月の年)
UNIX_TIMESTAMP関数とFROM_UNIXTIME関数に言及するために "+1"と言いたかっただけです。 – Narcissus
もう少し答えを集めた後に戻ってチェックしてください....ありがとう!これは良い答えです。 – mpen