2009-06-10 7 views
19

私は通常、PHPのtime()関数をMySQLデータベースに使用して整数を格納しています。これは、MySQLの日付形式を使用するのではなく、簡単に取り除くと操作しやすいからですが、これには何らかの欠点がありますか?MySQLの日付またはPHP時間?

答えて

24

範囲:

明らかな欠点が常にあります:あなたが保存できる範囲は限らフラン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のタイムスタンプは、タイムゾーンのデータを格納することはできません。私は単一のタイムゾーンを持つスウェーデンに住んでいるので、これは本当に問題ではありません。しかし、あなたが複数のタイムゾーンにまたがる国に住んでいると、大きな痛みになる可能性があります。

+0

UNIX_TIMESTAMP関数とFROM_UNIXTIME関数に言及するために "+1"と言いたかっただけです。 – Narcissus

+0

もう少し答えを集めた後に戻ってチェックしてください....ありがとう!これは良い答えです。 – mpen

4

私は同じことをしていましたが、今はMySQLのDateTimeとして保存しています。データベースの生データを見ると、簡単に解釈できるからです。

それ以外の場合は、UNIXタイムスタンプを使用しない他の言語(PHPのように)でデータを扱う方が簡単かもしれませんが、実際にはどちらかといえば大きな違いはありません。

9

1つの欠点は、SQL関数を使用してこれらの日付を操作してクエリすることができないことです。あまりにも悪くないのですが、あなたのような機能が内蔵され、いくつか失うことになります

0

はdateColumn =のgetDate()TABLE1から選択* - 30

使用日時をできれば!

1

私は考えることができます:
*別の非PHPアプリケーションでデータベースを使用する必要がある場合、これは読みにくい形式になります。
*これらの日付にSQLベースの作業を行いたい場合(たとえば、月の追加や特定の年のすべての値の取得など)、これはもっと難しくなります。

+0

int(10)intを変更することができ、固定されていません。 –

1

若干の細部の喪失。 MySQL Datetime変数は非常に正確です。

また、データベースの日付を比較する必要がある場合、日付形式には使用できない組み込み関数がいくつかあります。

+0

DATETIMEがより正確であるというあなたの主張の参照を見たいと思います。 –

+1

あなたはより正確な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

3

UNIXタイムスタンプには、保存可能な日付の範囲に関して明らかな制限があります。

また、常にDATETIMEフィールドを使用しています。 SQLを使用してDATEの計算を多く行うことができるので、PHPを一切使用せずにDATEDIFFのような有益な情報を現在から保存されている日付まで引き出すことができます。

2

は多くの欠点があります:精度の

  • 不足。 UNIXの時刻は2番目の日付にのみ正確で、通常の32ビット整数を使用する場合は1901-12-13と2038-01-19の日付の間です。
  • クエリには組み込みデータベース関数を使用できません。あなたがtime_tが必要な場合は、コード内のいずれかに変換するのは簡単です、あなたはタイムゾーン

を保存することはできません

  • データを操作します。

  • 1

    スケーラビリティの理由から、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
    +0

    私は実際に内部的に文字列として格納されているとは思わない。そして、どのようにDBの計算がより少ないのかわかりません... 'date_add(my_date、interval 2 months)'は一度だけ計算されるべきですが、とにかくPHP側で行うことができます。タイムゾーンのことについてはわかりません... MySQLのタイムスタンプにタイムゾーンが埋め込まれているのですか、データベースごとにグローバルなのでしょうか? – mpen

    +0

    MySQLでは、これらはUTCとして保存され、クライアントのタイムゾーンのために引き出されます。 MySQLから[Documentation](http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html) "TIMESTAMPカラムの値は、現在のタイムゾーンからストレージのためにUTCに変換され、 UTCから現在のタイムゾーンまで取得することができます。 " –

    +0

    さて、私は今あなたのポイントを見ます。私はあなたがそれをPHP側に変換したい場合にMySQLを設定すると、タイムゾーンが問題になるとは思わないが、string-> int-> string最適化は有効な点ですが、大きな費用はかかりません。あなたは何ページ、おそらく100の日付を解析していますか? – mpen

    関連する問題