MySQLで日付を扱う!DATE・DATETIME・TIMESTAMPの違いを初心者向けに徹底解説
生徒
「MySQLでテーブルを作るとき、日付を入れる場所を作りたいんですけど、種類がいっぱいあってどれを選べばいいか分かりません…。」
先生
「確かに、日付や時間に関する『データ型』はいくつかありますね。主に使うのはDATE、DATETIME、TIMESTAMPの3つです。」
生徒
「それぞれ何が違うんですか?カレンダーの日付が入れば何でも同じ気がしちゃうんですけど…。」
先生
「実は、時間の細かさや、保存できる期間の長さに大きな違いがあるんですよ。今日はパソコンに詳しくなくても分かるように、図解を交えてじっくり解説しますね!」
1. データベースの「データ型」とは?
まず最初に、データベース(MySQL)における「データ型」という言葉についてお話しします。 データベースとは、たくさんの情報を整理してしまっておく「魔法の引き出し」のようなものです。 この引き出しにはルールがあって、「この段には数字だけ」「この段には文字だけ」という風に、入れるものの種類をあらかじめ決めておかなければなりません。
この「入れるものの種類」のことをデータ型(データがた)と呼びます。 日付や時間を保存したいときも、専用のデータ型を選んであげる必要があります。 間違った型を選んでしまうと、あとで「何時何分に注文されたか分からない!」とか「100年後の予約が登録できない!」といった困ったことが起きてしまいます。
2. DATE型:日にちだけを管理する「カレンダー」
DATE(デイト)型は、その名の通り「日付」だけを保存するための型です。 「2026年2月6日」という情報は保存できますが、「何時何分」という細かい時間は捨ててしまいます。
身近な例で言うと、紙のカレンダーに丸をつけるようなイメージです。 誕生日、祝日、有効期限(日単位)など、時刻までは必要ない項目にぴったりです。
形式は「YYYY-MM-DD」という形で保存されます。 YはYear(年)、MはMonth(月)、DはDay(日)の頭文字ですね。
では、実際にDATE型を使ったテーブルを作ってみましょう。 例えば、社員の誕生日を管理する「employees」というテーブルを考えてみます。
id | name | birth_date
---+----------+------------
1 | 佐藤太郎 | 1990-05-15
2 | 鈴木花子 | 1985-11-20
3 | 高橋健一 | 2000-01-01
4 | 田中愛子 | 1998-07-12
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
birth_date DATE
);
3. DATETIME型:日時を丸ごと記録する「スケジュール帳」
DATETIME(デートタイム)型は、日付と時間の両方をセットで保存できる型です。 「2026年2月6日 15時30分00秒」という風に、秒単位までしっかりと記録できます。
これは、分刻みで予定を書き込む「スケジュール帳」や、お店の「予約システム」に最適です。 非常に広い範囲の日付を扱うことができ、西暦1000年から西暦9999年まで保存可能です。 未来の予約や、大昔の歴史的な出来事を記録するのにも使えますね。
形式は「YYYY-MM-DD HH:MM:SS」となります。 HはHour(時)、MはMinute(分)、SはSecond(秒)です。
予約管理テーブル「appointments」の例を見てみましょう。
id | guest_name | reserved_at
---+------------+---------------------
1 | 山田次郎 | 2026-03-01 10:00:00
2 | 伊藤美咲 | 2026-03-01 13:30:00
3 | 中村修 | 2026-03-02 18:00:00
4 | 小林由美 | 2026-03-05 11:15:00
CREATE TABLE appointments (
id INT PRIMARY KEY,
guest_name VARCHAR(50),
reserved_at DATETIME
);
4. TIMESTAMP型:システムが自動で刻む「タイムスタンプ」
TIMESTAMP(タイムスタンプ)型もDATETIMEと同じく日付と時間を保存しますが、少し特殊な性質を持っています。 一番の特徴は、「データが更新されたときに、自動でその時の時刻を書き込んでくれる」という便利な機能がよく使われる点です。
例えば、SNSの投稿時間や、情報の最終更新日時などを記録するのに向いています。 ただし、注意点があります。保存できる範囲がDATETIMEよりずっと狭く、2038年までしか保存できません。 (これをIT業界では「2038年問題」と呼んだりします)。
また、TIMESTAMPは「世界標準時」を意識した動きをします。 日本で保存した時間を、アメリカで見ると現地の時間に自動で計算し直してくれるような仕組みが得意です。
ブログの投稿管理テーブル「posts」を作ってみましょう。
id | title | updated_at
---+------------------+---------------------
1 | SQLの基本 | 2026-02-06 09:00:00
2 | データ型の違い | 2026-02-06 10:45:12
3 | 初心者向け講座 | 2026-02-06 12:00:05
4 | MySQLのインストール| 2026-02-06 15:20:30
CREATE TABLE posts (
id INT PRIMARY KEY,
title VARCHAR(100),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
※DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPという魔法の言葉を書くと、「データが入った時や更新された時に、今の時間を自動で入れるよ!」という意味になります。
5. DATE・DATETIME・TIMESTAMPの比較まとめ
ここまでの内容を整理するために、表で比較してみましょう。 どれを使うべきか迷ったときの参考にしてください。
| データ型 | 保存内容 | 範囲 | 主な用途 |
|---|---|---|---|
| DATE | 日付のみ | 1000年〜9999年 | 誕生日、記念日、支払日 |
| DATETIME | 日付 + 時間 | 1000年〜9999年 | 予約日時、イベント日時 |
| TIMESTAMP | 日付 + 時間 | 1970年〜2038年 | 作成日時、最終更新日時 |
基本的には、「日付だけでよければDATE」、「時間も必要で、遠い未来まで扱いたいならDATETIME」、「データの更新時間を自動で記録したいならTIMESTAMP」と覚えておけば間違いありません。
6. 実際にテーブルを作ってデータを追加してみよう
それでは、学習の仕上げとして、これら3つの型をすべて含んだ「注文管理テーブル」を作ってみましょう。 注文した日(DATE)、配達希望日時(DATETIME)、データ作成日時(TIMESTAMP)を使い分けます。
CREATE TABLE orders (
id INT PRIMARY KEY,
item_name VARCHAR(100),
order_date DATE,
delivery_at DATETIME,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
テーブルができたら、データを1件入れてみましょう。 SQLでは日付や時間は「'(シングルクォーテーション)」という記号で囲むルールがあります。
INSERT INTO orders (id, item_name, order_date, delivery_at)
VALUES (1, 'ノートパソコン', '2026-02-06', '2026-02-10 14:00:00');
実行結果を確認すると、created_atには何も指定していませんが、自動で現在時刻が入ります。
id | item_name | order_date | delivery_at | created_at
---+----------------+------------+---------------------+---------------------
1 | ノートパソコン | 2026-02-06 | 2026-02-10 14:00:00 | 2026-02-06 12:40:45
7. 日付データを扱うときの注意点とコツ
最後に、初心者の方がつまずきやすいポイントをいくつか紹介します。
1. フォーマット(形式)を揃える
MySQLでは通常、「2026/02/06」のようにスラッシュで区切るのではなく、ハイフンを使った「2026-02-06」という形式で書くのが基本です。
2. 存在しない日付は入れられない
「2026-02-30」や「2026-13-01」のような、現実に存在しない日付を入れようとするとエラーになります。データベースがしっかりチェックしてくれている証拠ですね。
3. 時間の計算もできる
データベースに日付を保存しておくと、後から「1週間後の日付を表示して」「注文から何日経ったか計算して」といった指示も簡単に出せるようになります。
これは単なるメモ帳ではなく、計算が得意な「データベース」ならではのメリットです。
いかがでしたか?DATE、DATETIME、TIMESTAMPの違いを理解することで、より正確で使いやすいテーブルが作れるようになります。 まずは自分の作りたいシステムに合わせて、最適な型を選んでみてくださいね。
まとめ
MySQLにおける日付データの扱いは、Webアプリケーション開発において非常に重要な役割を果たします。 本記事では、主要なデータ型であるDATE型、DATETIME型、TIMESTAMP型の3種類について、それぞれの特徴や最適な活用シーンを詳しく解説してきました。 ここで、特に重要なポイントを再確認しましょう。
1. 各データ型の決定的な違いと使い分け
データ型を選ぶ際の基準は、「情報の細かさ(精度)」と「データの有効範囲(期間)」、そして「自動更新が必要か」という点に集約されます。
- DATE(日付): 時間の情報が不要な場合(誕生日、祝日、納品予定日など)に使用します。ストレージ容量も節約でき、カレンダー形式の管理に最適です。
- DATETIME(日時): 日付と時間をセットで管理し、かつ過去1000年から未来9999年までという膨大な範囲をカバーしたい場合(予約管理、イベントスケジュール、歴史データなど)に最適です。
- TIMESTAMP(タイムスタンプ): データの登録日時や更新日時をシステム側で自動管理したい場合に強力な威力を発揮します。ただし、2038年問題という保存期限があるため、将来的なシステム寿命を考慮して選択する必要があります。
2. SQLでの具体的なデータ操作と実践
実際の開発現場では、これらの型を組み合わせて一つのテーブルを構成することが一般的です。 例えば、顧客のステータスを管理する「members」テーブルを想定してみましょう。 入会日、最終ログイン日時、そしてデータが最後に更新された日時をそれぞれ適切な型で定義します。
実行前のテーブル状態(サンプル)
id | name | join_date | last_login_at | updated_at
---+----------+------------+---------------------+---------------------
1 | 山田太郎 | 2023-01-10 | 2026-02-05 10:00:00 | 2026-02-05 10:00:00
2 | 佐藤花子 | 2023-05-20 | 2026-02-04 15:30:45 | 2026-02-04 15:30:45
3 | 鈴木一郎 | 2024-11-01 | 2026-02-06 09:15:20 | 2026-02-06 09:15:20
4 | 伊藤純次 | 2025-02-01 | 2026-02-06 08:00:00 | 2026-02-06 08:00:00
テーブルの定義とデータ更新のSQL
/* テーブルの作成 */
CREATE TABLE members (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
join_date DATE, /* 入会日(日付のみ) */
last_login_at DATETIME, /* 最終ログイン(日時) */
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP /* 更新用 */
);
/* 既存ユーザーのログイン日時を更新する例 */
UPDATE members
SET last_login_at = '2026-02-06 23:55:00'
WHERE id = 1;
SQL実行後のテーブル状態
id | name | join_date | last_login_at | updated_at
---+----------+------------+---------------------+---------------------
1 | 山田太郎 | 2023-01-10 | 2026-02-06 23:55:00 | 2026-02-06 23:55:00
2 | 佐藤花子 | 2023-05-20 | 2026-02-04 15:30:45 | 2026-02-04 15:30:45
3 | 鈴木一郎 | 2024-11-01 | 2026-02-06 09:15:20 | 2026-02-06 09:15:20
4 | 伊藤純次 | 2025-02-01 | 2026-02-06 08:00:00 | 2026-02-06 08:00:00
上記の実行結果を見ると、ID 1の「last_login_at」を手動で更新した際、ON UPDATE CURRENT_TIMESTAMPを設定している「updated_at」も自動的に現在のシステム時刻に書き換わっていることが分かります。これがTIMESTAMP型の大きなメリットです。
3. 開発時に意識すべきベストプラクティス
MySQLで日付を扱う際には、単に型を選ぶだけでなく、以下の運用ルールを意識するとトラブルを防げます。
- タイムゾーンの考慮: グローバルなサービスを展開する場合、TIMESTAMPはシステム設定のタイムゾーンに影響を受けるため注意が必要です。一方でDATETIMEは、入力した値がそのまま保存されます。
- NULLの許容設定: 「まだ日付が決まっていない」状態を許容するかどうか(NOT NULL制約を入れるか)を、設計段階で明確にしましょう。
- 日付関数の活用:
NOW()(現在日時)やCURDATE()(現在日付)といったMySQL関数を使いこなすことで、プログラム側で日付を生成する手間を省き、データベース側で正確な時間を記録できます。
適切なデータ型の選択は、システムのパフォーマンス向上や、将来的なメンテナンスコストの削減に直結します。 最初は難しく感じるかもしれませんが、「日付だけか、時間もか」「自動更新するか」というシンプルな視点からスタートしてみてください。
生徒
「先生、ありがとうございました!DATE、DATETIME、TIMESTAMPの違い、かなりスッキリしました。特に『自動で更新してくれる』TIMESTAMPは便利そうですね!」
先生
「そうですね。更新日時を自動で記録してくれるのは、変更履歴を追いかけたいときに非常に重宝します。ただ、先ほど話した『2038年問題』があることは忘れないでくださいね。」
生徒
「はい、2038年って意外とすぐ来ちゃいそうですよね…。100年後の予約システムを作るなら、範囲が広いDATETIMEを選んだほうが安心っていうことですよね?」
先生
「その通り!素晴らしい理解力です。最近のWeb開発では、範囲の広さと正確さを重視してDATETIMEを使い、現在時刻の取得はSQLの関数で行うケースも増えていますよ。」
生徒
「なるほど。用途によって使い分けるのがプロの技なんですね。あと、SQLで日付を扱うときは『'(シングルクォーテーション)』で囲むのも、文字型と同じで忘れちゃいけないポイントだと思いました。」
先生
「おっ、よく気づきましたね。形式を『YYYY-MM-DD』のハイフン繋ぎにするのも基本ルールです。これさえマスターすれば、MySQLでの日付操作はもう怖くないですよ!」
生徒
「ありがとうございます!さっそく自分の学習用データベースでも、今日学んだ型を使ってテーブルを作り直してみます!」