MySQL の DATETIME と TIMESTAMP
DATETIME
と TIMESTAMP
は、日付と時刻の部分を含む必要がある値を格納するために使用できる 2つの異なるデータ型です。
この記事では、データベースに格納される形式と、各データ型に必要なメモリについて学習します。また、両方のデータ型の類似点と相違点を確認し、例を使用して理解しようとします。
DATETIME
と TIMESTAMP
の類似点
DATETIME
と TIMESTAMP
には、以下に示すいくつかの類似点があります。
- どちらも同じタイプのデータを格納し、2つの部分(日付と時刻)があります。
- クエリを実行するときは、どちらも同じ形式です。
- データベースに保存する形式は同じです(
YYYY-MM-DD hh:mm:ss
)。 - どちらも、小数秒の精度のために追加のバイトが必要です。
- レコードが更新されるたびに、両方が現在の日付と時刻でデータを変更できます。
DATETIME
と TIMESTAMP
の違い
DATETIME
と TIMESTAMP
には次の違いがあります。
DATETIME
とTIMESTAMP
には、それぞれ 5 バイトと 4 バイトが必要です。TIMESTAMP
はタイムゾーンの影響を受けますが、DATETIME
は一定のままです。DATETIME
およびTIMESTAMP
でサポートされる範囲は、'1000-01-01 00:00:00'
~'9999-12-31 23:59:59'
と'1970-01-01 00:00:01'UTC
~'2038-01-19 03:14:07' UTC
です。DATETIME
はインデックス付けできませんが、TIMESTAMP
はインデックス付けできます。TIMESTAMP
のクエリはキャッシュされますが、DATETIME
のクエリはキャッシュされません。
MySQL での DATETIME
と TIMESTAMP
の使用を理解するための例
あなたがあなたの国でコーヒーショップを経営していると仮定しましょう。各顧客は、請求書の支払い後に請求書を受け取ります。
この請求書には、他の詳細に加えて日付と時刻が含まれています。すべての顧客が同じタイムゾーンにいる国でのみショップを運営しているため、DATETIME
を使用します。
このシナリオを少し変更してみましょう。現在、さまざまな国に 10 のコーヒーショップがあり、それぞれの国にタイムゾーンがあります。顧客にも請求書が届きますが、顧客のタイムゾーンに応じて日付と時刻を表示するにはどうすればよいですか。
ここでは、TIMESTAMP
を使用します。どうして?TIMESTAMP
はタイムゾーンの影響を受けるため、TIMESTAMP
の値は、保存時には現在のタイムゾーン(サーバの時刻)から UTC(世界標準時)に変換され、取得時には現在のタイムゾーン(サーバの時刻)に戻されるからです。)取得時。
サンプルコード:
MySQL で次のコードを実行して(このチュートリアルでは MySQL 8.0.27 を使用しています)、コードの後に出力が表示されます。
#create schema
CREATE SCHEMA db_practice_datetime_timestamp;
#create table
CREATE TABLE practice_datetime_and_timestamp (
ID INT AUTO_INCREMENT PRIMARY KEY,
DATE_TIME DATETIME,
TIME_STAMP TIMESTAMP
);
#insert data
INSERT INTO practice_datetime_and_timestamp(TIME_STAMP,DATE_TIME)
VALUES(NOW(),NOW());
#read data
SELECT DATE_TIME, TIME_STAMP from practice_datetime_and_timestamp;
出力:
次に、以下のコードを実行して、その出力を確認します。
SET time_zone = '-05:00';
SELECT DATE_TIME, TIME_STAMP from practice_datetime_and_timestamp;
出力:
TIME_STAMP
列の時刻が変更されていることに気付いたかもしれませんが、DATE_TIME
のデータは同じままです。
まとめ
この議論では、DATETIME
と TIMESTAMP
はニーズに応じて同じデータを保存すると結論付けました。データをタイムゾーンの影響を受けたい場合は、TIMESTAMP
に進んでください。それ以外の場合は、DATETIME
を使用することをお勧めします。