web-dev-qa-db-ja.com

日付をMySQLに保存するためのベストプラクティスPHP

私はずっとunixタイムスタンプを使ってきました。

比較しやすいので気に入っています。整数として保存しているので高速です。また、PHPを使用しているため、unixtimestampからdate()関数を使用して任意の日付/時刻形式を取得できます。

現在、一部の人々は、DATETIME形式を使用するのが最善であると言っています。しかし、より適切な名前以外に、私には何の利点もありません。

DATETIMEを使用する方が本当に良いですか?もしそうなら、どのような利点がありますか?

ありがとう。

25
treznik

日付をUnixタイムスタンプとしてデータベースに保存すると、手間がかかります。それらを使用したい形式に変換する必要があり、日付範囲間で計算を行う必要があり、範囲内のデータを取得するためのクエリを作成する必要があります。これは直感に反しているようです。確かに、あなたの「プログラマーの時間」は実際の問題の解決に最もよく費やされていますか?

MySQLが利用できる適切な形式で日付と時刻を保存してから、データベース関数を使用して必要なデータのクエリを作成することをお勧めします。すべての変換といじくり回しを行うのに無駄になる時間は、午後に読んで(そして理解して)費やした時間と比較して膨大です 11.6 MySQLの日付と時刻の関数

31
Gav

私はまた、生涯にわたってUNIXタイムスタンプの大ファンでした。しかし、正解は「依存する」だと思います。最近、URLのみを一覧表示したい単一のテーブルデータベースを作成しました。日付フィールドがありますが、日付フィールドは純粋にソート用です。つまり、last_crawledによる注文です。つまり、そのフィールドで組み込みの日付関数を使用することは決してありません。これは、最も古いエントリを最初に取得する簡単な方法であり、このフィールドに日付関数を適用することは決してありません。さて、これを日付フィールドにしたとしたら、2つのことを失っていただろう。

  1. 日時フィールドは整数の2倍のサイズです
  2. 整数による並べ替えの方が高速です(これが100%確実ではありません、 この質問の保留中の結果

ただし、別のシステムでは、トランザクション情報を保存する必要がありました。これにより、 内部mysql日付関数 が可能になり、レポートの作成を開始する必要があるときに非常に役立つことがわかりました。

9
coderama

MySQLの日付/時刻タイプ を使用する利点の1つは、 MySQLの日付/時刻関数 をより簡単に使用できることです。

DATEタイプには、日、月、年のみを格納するという利点もあります。そのため、エポック時間から1秒後に、日だけを気にし、気にしない状況では、スペースの浪費や比較の複雑さがなくなります。時間。

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

7
cletus

@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整数から日時またはタイムスタンプのデータ型に移行しました。これは、読み取りと操作がはるかに簡単であるためです(テーブルに直接アクセスすることが非常に多くあります)。しかし、私は最近、2つの理由でこのアプローチを再考し始めました。

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

私はまだこれに対する答えを自分で理解しようとしています。

6
hessodreamy

データベースdatetimeを使用すると、クエリが必要になるたびにfrom_unixtime()関数を適用して、テーブルのunix datetimecolからデータを抽出する必要があるため、より効率的です。 where句でこの関数を使用すると、インデックスの使用は完全に無視されます。

私のクエリは次のとおりです。

wtvdate1とwtvdate2の間のcolUnixdatetimeがあるテーブルからcol1、col2、colUnixdatetimeを選択します

私は実行する必要があります:

wtvdate1とwtvdate2の間のFrom_Unixtime(colUnixdatetime)であるテーブルからcol1、col2、colUnixdatetimeを選択します。

上記のクエリはインデックスを完全に無視します。インデックスは使用されないため、ここではインデックスを使用しません。実際の日時を取得するには、常に関数を使用する必要があります。

Where句の条件のLHSで使用される組み込み関数はインデックスを使用せず、巨大なテーブルがある場合、クエリにかかる時間が長くなります。

3
Smita V

メンテナンスが簡単なのはプラスです。あなたがするときに実際の日付を見る:

select * from table where ...

かなりいいです。

2
Todd Gardner

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

1
erenon