実際のMySQLとPHPでの日時とタイムスタンプの比較


24

データ型を日時またはタイムスタンプとして指定する方法がわかりません。両方のイベントが必要ですが、両方が必要になると思います。私のウェブサイトは世界中で製品とサービスを販売しており、ユーザーがログインするためのアカウントシステムも持っています。以下を明確にしてください:

  • お客様が私のウェブサイトから製品を購入する現在の日時:日時?
  • システムから計算された場所と購入日時に基づく配達日時:日時?
  • 前回アカウントにログインしたとき:タイムスタンプ?

    1. 購入日(現在の日付)を保存し、データベースに保存するためのPHPのコードは何ですか?
    2. インターネットで多くの説明を読んだ後、私はまだそれを理解できないので、それらのそれぞれの使用方法を詳しく説明してください。

私はパフォーマンスは絶対必要だった大規模なプロジェクトは、私たちはvarchar型のフィールドに格納されているUTCタイムスタンプと一緒に行くことになった研究の数ヶ月後に、それはより速く、より良い我々のニーズ(大ソーシャルネットワーク)のためであることが証明されていたしばらく前にA
JasonDavis

回答:


29

MySQL タイムスタンプ

  • UTCで保存されます

    ストレージでUTCに変換され、取得時にタイムゾーンに変換されます。タイムゾーン設定変更すると、取得される値も変更されます。

  • 自動的に初期化および更新できます

    デフォルト値および/または自動更新値を設定できます CURRENT_TIMESTAMP

  • 1970-01-01 00:00:01 UTC〜の範囲がある2038-01-19 03:14:07 UTC

一方、MySQL datetime

  • 保存するのは、あなたが得るものです™。

  • 1000-01-01 00:00:00〜の範囲がある9999-12-31 23:59:59

    範囲外の値でも機能する場合がありますが、範囲内の値のみが機能することが保証されています。

  • 日または月がゼロの日付を保存できます。

    これは、誕生日を保存するMySQLの方法です!を使用してこれを行うことはできません。TIMESTAMP唯一の例外はのゼロ値です0000-00-00

  • 必要な場合は、ALLOW_INVALID_DATESモードで無効な日付を保存できます。

  • 場合によってNOW()はデフォルト値をに設定できますが、自動的に初期化および更新される日付の望ましい自然な方法はTIMESTAMPです。

そしてもちろん、そこにもあるDATETIMEちょうど同じように動作している、DATETIMEが、もちろんDATE気にしない時間とTIME日付のために気にしません。4つのデータ型はすべて、幅広い日付および時刻関数と完全に連携しますが、データ型を混在させる場合は、変換効果に注意する必要があります。

さて、あなたの質問に:DATETIMEどこでも使用する必要があります。技術的な理由ではありませんが、MySQLがどのように機能するのかまだ不明なためDATETIME、より簡単な選択です。これは、保存する前にPHPで現在のタイムスタンプを計算する必要があることを意味します。

$mysqldate = date("Y-m-d H:i:s"); 

PHPの日付関数は次のように機能します。

string date ( string $format [, int $timestamp = time() ] )

この"Y-m-d H:i:s"形式はMySQLと互換性があり、2番目のパラメーターを空のままにして、現在のUNIXタイムスタンプを取得するためのdate()呼び出しtime()を行います。

aのTIMESTAMP代わりにa を使用するDATETIMEと、現在のタイムスタンプを決定する責任を引き継ぐMySQLの付加価値があり、挿入/更新時にフィールドをスキップできます。ただし、すでにクエリを送信しており、PHPで現在のタイムスタンプを取得するコードは最小限であるDATETIMEため、すべてに安全に対応できます。

PHPタイムスタンプをデータベースに保存する実際のコードについては、PHP Data Objectsご覧ください。まだ不明な場合は、代わりにStackOverflowで確認してください。ただし、すでに1.5kに関連する質問がありますので、質問する前に必ず確認してください。ちょっとしたヒントとして、準備されたステートメントは、クールな子供たちがどのように行うかです。


うーん、これはクエリをMySQLに送信する方法、またはテーブル構造で問題になる可能性があります... StackOverflowはこれらの種類の問題に適した場所です。テーブル構造と完全なphpコードで質問を投稿してください。問題の内容と既に試した内容の詳細。ここでは実装の詳細については実際には説明しません...
yannis

お返事をありがとうございます。$ mysqldate = date( "Ymd H:i:s");を使用してみました。$ query = phpコードのINSERT INTO table VALUE( '"。$ mysqldate。"')が、MySQLでは日付(フィールド)-日付時刻(データ型)で0000-00-00 00:00:00として保持されます。現在の日付と時刻を保存する予定です。データベースでデータ型をタイムスタンプとして設定した場合、phpでコーディングする方法は?
モジュラー

現時点では、Stackoverflowにコメントを投稿することはできません。少し恥ずかしそうに聞こえますが、それが彼らのやり方です。
モジュラー

申し訳ありませんが、一時停止モードになっている場合は、十分な理由が必要です。さてについてコメント内のコード内の1つの可能性のあるエラーは、あなたのようにフィールドを命名されていることであるDateため、予約語だと、DATEデータ型が奇妙な物事は、そうのようなものに名前を変更してみてください(MySQLのバージョンに依存します)発生する可能性がありcreationdate、何が起こるか見ます。また、PHPからTIMESTAMPフィールドをフィールドと同じように扱う必要がありDATETIMEますが、それは実際には問題ではありません。それらの形式は同じです。
ヤニス

感謝万円。理由を突き止めようとしてほぼ一晩を費やした後、今では分類されています。:)
モジュラー

2

この記事から引用したリファレンス:

主な違い:

TIMESTAMPは、レコードの変更を追跡し、レコードが変更されるたびに更新するために使用されます。レコードの変更の影響を受けない特定の静的な値を格納するために使用されるDATETIME。

TIMESTAMPは、さまざまなTIME ZONE関連の設定の影響も受けます。DATETIMEは一定です。

TIMESTAMPは、現在のタイムゾーンを保存のために内部的にUTCに変換し、取得中に現在のタイムゾーンに変換し直しました。DATETIMEではこれができません。

TIMESTAMPがサポートする範囲: '1970-01-01 00:00:01' UTCから '2038-01-19 03:14:07' UTC DATETIMEがサポートする範囲: '1000-01-01 00:00:00'から '9999 -12-31 23:59:59 ′


1
2040年、レコードの変更にタイムスタンプを使用しますか?そうではないと思います。
Bsienn

-1

さて、私はこれを非常に簡単な方法で見ます。あなたの場合、私は両方datetimeを使用しtimestampます。両方を使用すると、データの保存などの問題は発生しません。テーブル内の1つの追加フィールド(列)も大きな問題ではありません。

そのため、これまでの私の視点と経験では、通常両方を使用しています。訪問者に日付を表​​示したい場合、または訪問者が理解できるようにしたい場合は、日付形式で日付を表示します。

日付時刻形式は、何かを計算するときに苦痛になる可能性があります(2つの日付の差、現在の日付から昨日の日付を取得、現在の日付から1週間前に取得、明日などを取得します)。それらを変換してから処理する必要がありtimestampます。はい、たとえば、現在の日付時刻を取得します:$current = date("Y-m-d");または$current = date("Y-m-d H:i:s");、時間、分、秒も必要な場合。

タイムスタンプは長さ11桁の数字で、実際には何も「意味」を持ちません。それを見ると、それがどの日付を表しているのかわかりません。したがって、実際にはユーザーフレンドリーではなく、単にエコーして訪問者に表示するために使用することはできません。それを読みやすいものに「変換」する必要があります。ただし、簡単に変換したり、さまざまな日付を計算したりすることもできます。たとえば、明日のタイムスタンプを同時に取得したい場合は、現在の日付に秒数を追加するだけで、明日のタイムスタンプを取得できます。例:$tomorrow = time()+24*3600;2つの日付の差を秒単位で簡単に取得することもできます。

したがって、日時とタイムスタンプの両方を使用することをお勧めします。たとえばPhpMyadminを使用して一部のデータをすばやく見たい場合でも、日付と時刻の形式(例2011-12-20 10:15:20:)で日付を表示すると、11桁の数字を見るだけの場合よりも簡単になります。したがって、両方を使用してから、より適切なものを呼び出して使用してください。

1つだけを選択する必要がある場合、または選択する場合は、両方を使用することをお勧めします。


1
-1 Timestamp is just a number 11 digit long which doesn't really "mean" anythingMySQLタイムスタンプは、日時と同じ形式で保存されます。あなたが記述した計算を行うために、それらを同様にPHPタイムスタンプに変換するか、単にMySQLの多くの日付/時刻関数を使用してデータベースで計算を行う必要があります。あなたの答えは本当に意味をなさない。
ヤニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.