2009-07-12 15 views
22

私はすべての人生でUNIXタイムスタンプを使用してきました。PHPからMySQLに日付を保存するためのベストプラクティス

私はそれが好きです。私はそれを比較するのが簡単だから、それは整数として保存するので高速です。 PHPを使用しているので、unixtimestampからdate()関数を使って日付/時刻形式を取得できます。

ここで、DATETIME形式を使用するのが最善だと言っている人もいます。しかし、より適切な名前の他に、私には利点がありません。

DATETIMEを使用する方が良いでしょうか?その場合、どのような利点がありますか?

ありがとうございました。

答えて

28

データベースに日付をUnixタイムスタンプとして格納すると、大変な作業になります。使用する形式に変換する必要があり、日付範囲の間で計算を行う必要があります。範囲内のデータを取得するためにクエリを作成する必要があります。これは、直感に反しているようです。確かに、あなたの「プログラマーの時間」は本当の問題を解決するのに一番いいですか?

日付と時刻をMySQLが使用できる適切な形式で保存し、データベース関数を使用して必要なデータのクエリを作成する方がはるかに良い方法です。 11.6 MySQL Date and Time Functions

+0

私は訂正しました。 :) – treznik

+1

私は同意しない。私の答えをチェックしてください。 – coderama

+0

MySQLのDATETIMEフィールドにはタイムゾーンがありません。常に日付をUTCに保存してください(つまりNOW()を使わないでください - UTC_TIMESTAMP()を使用してください)そうしないと、アプリケーションを国際化しようとすると、あなたのサーバーのタイムゾーン。 – jmc

7

MySQL date/time typesを使用する利点の1つは、date/time functions in MySQLをより簡単に使用できることです。

DATEタイプには、日、月、および年のみを格納するという利点もあります。そのため、時間が覚えていた日ではなく、時間。

個人的に私はデータベースをデータのダンプとして使う傾向があるので、このような機能はあまり関心がありません。 PHPでは、あなたが述べる理由のために、日付を整数形式で保存する傾向があります。

1

比較が簡単で、mysqlは多くの日付機能を提供します。

2

メンテナンスが簡単です。実際の日時を確認する:

select * from table where ... 

かなりいいです。

3

あなたが照会する必要があるたびにfrom_unixtime()を適用する必要があるため、データベースのdatetimeを使用するほうが効率的です。これは、すべての変換とムックを無駄にする時間は、テーブルのunix datetime colからデータを抽出する関数です。 where句でこの関数を使用すると、インデックスの使用は完全に無視されます。

は私のクエリがあると言う:

選択COL1、COL2、テーブルからcolUnixdatetime wtvdate1間、私は実行する必要があります

をwtvdate2 colUnixdatetime:

COL1を選択し、COL2、colUnixdatetimeはどこのテーブルからwtvdate1とwtvdate2の間のFrom_Unixtime(colUnixdatetime)

上記のクエリはインデックスを完全に無視します。インデックスは使用されません。私はいつも私たちに持っています。実際の日付時刻を取得する関数。

where句のLHS条件で使用される組み込み関数は、インデックスを使用せず、HUGEテーブルを使用するとクエリに時間がかかります。

6

@Smita V、あなたが参照する非効率的なクエリは、すべてのテーブル行に変換関数を間違って適用しているためです。ここでは、条件自体にそれを適用する必要があります。だからではなく、テーブルの上にすべての行を変換し

select col1,col2,colUnixdatetime from table where From_Unixtime(colUnixdatetime) between wtvdate1 and wtvdate2 

、のあなたが持っている日付にそれを比較します。

select col1,col2,colUnixdatetime from table where colUnixdatetime between UNIX_TIMESTAMP(wtvdate1) and UNIX_TIMESTAMP(wtvdate2). 

このようにすると、適切なテーブルインデックスが使用されます。

@treznik私はuts整数からdatetime型またはtimestamp型にデータ型を移動しました。これは、上記の理由から、読み込みと操作がはるかに簡単です(私は直接のテーブルアクセス)。しかし、私は最近、二つの理由から、このアプローチを再考し始めました:

  1. あなたはあなた位置に基づいて、タイムゾーンを推測しているように、タイムゾーンの場所は、保存されていないがあります。これはあなたにとって問題かもしれません。
  2. 夏時間が無視されます。時計が午前2時に戻ると、午前1時30分に2回、2011年10月30日01:30にはこれを知らせません。一方、1319938200はこれを知らせます。私は文字列(2011-10-30 01:30 BST)を除いて、タイムゾーンを含む日付を格納するネイティブの方法がmysqlにあるとは思わない。

私はまだこれに対する答えを見つけようとしています。

+0

それについて教えてください、それはほぼ3年前だったとは信じられません。私はこのスレッドを開始してからずっとずっとdatetimeに切り替えましたが、それが正しい選択であると確信することは決してありませんでした。私はあなたが話すのと同じ問題に常に遭遇し、私はまだタイムスタンプが最終的な選択だと思っています。しかし、私は時々、物事を得るために、最も実用的な解決策を挙げて行きたいと思うことがあります。 – treznik

+1

datetimeにはタイムゾーンはありませんが、UTCとして日付を格納し、アプリケーションレイヤーまたはconvert_tz()を使用して適切なタイムゾーンに変換します。これにより、両方の問題が解決されます。 – SuperGreg

+1

さらに、タイムスタンプよりも実際にdatetimeが信頼できると思っています。なぜなら、UTCとして保存されているタイムスタンプとは対照的に、値が常に正確に私が格納した値(UTC) 。 – SuperGreg

8

私はまた、すべての人生のUNIXタイムスタンプの大ファンでした。しかし、私は正解が「依存する」と考える。私は最近、URLを一覧表示するだけのテーブルデータベースを作成しました。日付フィールドがありますが、日付フィールドは純粋にソート用です。私はlast_crawledで注文します。つまり、私は決してそのフィールドに組み込みの日付関数を使用しません。最も古いエントリを最初に取得するのは簡単な方法です。このフィールドには日付関数を使用しません。日時フィールドが二倍整数のサイズは整数でソート

  • は100%確実ではない(より速いです

    1. :さて、私はこの日付フィールドを作っていた、私は二つのことに出て負けていただろうこれ、pending outcome of this question

    しかし、別のシステムでは、トランザクション情報を保存する必要がありました。これは、internal mysql date functionsを使用して作成されました。これは、レポート作成を開始する必要があるときに非常に便利でした。

  • 関連する問題