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 を使用することをお勧めします。
