【完全ガイド】MySQLで現在時刻を取得・フォーマット・計算・活用する方法

目次

1. はじめに

MySQLで現在時刻を扱う重要性

MySQLは、データベースに格納される情報を適切に管理するために、時間の取り扱いが非常に重要です。特に現在時刻を取得・操作する機能は、ログの記録、スケジュールの管理、データの更新タイミングの記録など、多くの場面で利用されます。

例えば、次のようなケースで現在時刻を活用できます。

  • 注文管理システム: 注文日時を自動記録
  • ログ管理: システムのエラーログやアクセスログの記録
  • スケジュール機能: 未来の予定をデータベースに保存し、リマインドを送信

このように、MySQLで現在時刻を適切に扱うことは、データの整合性や分析精度を向上させるために非常に重要です。

「MySQL 現在時刻」を知りたいユーザーの目的とは?

「MySQL 現在時刻」と検索するユーザーの多くは、以下のような目的を持っています。

  1. 現在時刻を取得したい
  2. 取得した時刻をフォーマットしたい
  3. 時刻を操作(加算・減算)したい
  4. 特定の時刻範囲でデータを検索したい
  5. タイムゾーンを考慮して時刻を扱いたい

これらのニーズを満たすために、本記事では MySQLで現在時刻を取得する方法 を基礎から応用まで詳しく解説します。

この記事で学べること

本記事では、以下のポイントを体系的に学ぶことができます。

  • MySQLで現在時刻を取得する基本的な方法
  • 現在時刻のフォーマット変更方法
  • 日時計算(加算・減算)を行う方法
  • タイムゾーンを考慮した時刻の扱い方
  • 実践的な活用例(ログ管理・スケジュール管理など)

この情報を活用することで、MySQLのデータ管理をより効率的に行うことができるようになります。

2. MySQLで現在時刻を取得する方法

MySQLで現在時刻を取得する主な方法

MySQLで現在時刻を取得する方法はいくつかあります。主に NOW() 関数を使いますが、用途に応じて CURRENT_TIMESTAMPCURDATE(), CURTIME() も利用できます。

NOW() を使用して現在時刻を取得する

NOW() の基本構文

SELECT NOW();

実行結果(例)

2025-02-01 15:30:45

NOW() は現在の日時を YYYY-MM-DD HH:MM:SS の形式で取得します。

CURRENT_TIMESTAMP の利用

CURRENT_TIMESTAMPNOW() と同じ結果を返します。

CURRENT_TIMESTAMP の基本構文

SELECT CURRENT_TIMESTAMP;

実行結果(例)

2025-02-01 15:30:45

CURRENT_TIMESTAMP は、カラムのデフォルト値として使用できます。

CURRENT_TIMESTAMP をデフォルト値に設定する例

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

CURDATE() で日付のみを取得

CURDATE() の基本構文

SELECT CURDATE();

実行結果(例)

2025-02-01

時刻なしで、日付のみを取得できます。

CURTIME() で時刻のみを取得

CURTIME() の基本構文

SELECT CURTIME();

実行結果(例)

15:30:45

CURTIME() は時刻のみを取得する際に使用します。

各関数の比較表

関数名取得できるデータ主な用途
NOW()現在の日付と時刻(YYYY-MM-DD HH:MM:SSデータの作成・更新時刻の記録
CURRENT_TIMESTAMPNOW()と同じ(カラムのデフォルト値に適用可)テーブル作成時のデフォルト値
CURDATE()現在の日付のみ(YYYY-MM-DD本日の日付の取得・フィルタリング
CURTIME()現在の時刻のみ(HH:MM:SS特定の時間帯のデータ抽出

まとめ

  • 現在の日時を取得するなら NOW()
  • カラムのデフォルト値には CURRENT_TIMESTAMP
  • 日付だけが欲しいなら CURDATE()
  • 時刻だけが欲しいなら CURTIME()

3. MySQLの現在時刻をフォーマットする方法

DATE_FORMAT() を使って現在時刻をフォーマットする

DATE_FORMAT() の基本構文

SELECT DATE_FORMAT(NOW(), 'フォーマット文字列');

フォーマット文字列 を指定することで、日時の表示形式を変更できます。

基本的なフォーマット例

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
実行結果(例)
2025-02-01 15:30:45

DATE_FORMAT() のフォーマットオプション一覧

記号説明例(2025年2月1日 15:30:45)
%Y年(4桁)2025
%m月(ゼロ埋め)02
%d日(ゼロ埋め)01
%H時間(24時間制)15
%h時間(12時間制)03
%i分(ゼロ埋め)30
%s秒(ゼロ埋め)45
%pAM/PMPM

DATE_FORMAT() を使った具体例

日本語のフォーマット

SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H時%i分');
実行結果
2025年02月01日 15時30分

12時間制(AM/PMをつける)

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %h:%i:%s %p');
実行結果
2025-02-01 03:30:45 PM

TIME_FORMAT() を使って時刻をフォーマットする

TIME_FORMAT() は時刻データ(TIME 型)に特化したフォーマット関数です。

TIME_FORMAT() の基本構文

SELECT TIME_FORMAT(NOW(), '%H:%i:%s');
実行結果
15:30:45

STR_TO_DATE() を使って文字列を日付に変換

文字列の日時をMySQLのDATETIME 型に変換する場合に STR_TO_DATE() を使います。

STR_TO_DATE() の基本構文

SELECT STR_TO_DATE('2025年2月1日 15時30分', '%Y年%c月%e日 %H時%i分');
実行結果
2025-02-01 15:30:00

まとめ

  • 日時のフォーマット変更には DATE_FORMAT() を使う
  • 時刻のみのフォーマットには TIME_FORMAT() も利用可能
  • フォーマットオプションを組み合わせて自由に表示形式を変更できる
  • STR_TO_DATE() を使えば、文字列から日付型への変換も可能

4. MySQLの現在時刻を使った日時計算

DATE_ADD() を使って未来の日付を求める

DATE_ADD() の基本構文

SELECT DATE_ADD(NOW(), INTERVAL 数値 時間単位);
時間単位意味
SECONDDATE_ADD(NOW(), INTERVAL 30 SECOND)
MINUTEDATE_ADD(NOW(), INTERVAL 10 MINUTE)
HOURDATE_ADD(NOW(), INTERVAL 2 HOUR)
DAYDATE_ADD(NOW(), INTERVAL 7 DAY)
MONTHDATE_ADD(NOW(), INTERVAL 3 MONTH)

7日後の日時を取得

SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
実行結果(例)
2025-02-08 14:00:00

DATE_SUB() を使って過去の日付を求める

DATE_SUB() の基本構文

SELECT DATE_SUB(NOW(), INTERVAL 数値 時間単位);

30日前の日付を取得

SELECT DATE_SUB(NOW(), INTERVAL 30 DAY);
実行結果(例)
2025-01-02 14:00:00

TIMESTAMPDIFF() を使って2つの日時の差を求める

TIMESTAMPDIFF() の基本構文

SELECT TIMESTAMPDIFF(単位, 日時1, 日時2);
単位取得できる値
SECOND秒単位の差
MINUTE分単位の差
HOUR時間単位の差
DAY日単位の差
MONTH月単位の差

2つの日付の差を日単位で計算

SELECT TIMESTAMPDIFF(DAY, '2025-01-01', NOW());
実行結果(例)
31

DATEDIFF() を使って日数の差を計算

SELECT DATEDIFF('2025-02-10', '2025-02-01');
実行結果(例)
9

TIME_TO_SEC() を使って時間を秒数に変換

SELECT TIME_TO_SEC('01:30:00');
実行結果
5400

SEC_TO_TIME() を使って秒数を時間に変換

SELECT SEC_TO_TIME(5400);
実行結果
01:30:00

まとめ

関数役割使用例
DATE_ADD()未来の日時を取得SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
DATE_SUB()過去の日時を取得SELECT DATE_SUB(NOW(), INTERVAL 30 DAY);
TIMESTAMPDIFF()2つの日付の差を取得SELECT TIMESTAMPDIFF(DAY, '2025-01-01', NOW());
DATEDIFF()2つの日付の差を日単位で取得SELECT DATEDIFF('2025-02-10', '2025-02-01');
TIME_TO_SEC()時間を秒数に変換SELECT TIME_TO_SEC('01:30:00');
SEC_TO_TIME()秒数を時間に変換SELECT SEC_TO_TIME(5400);

5. タイムゾーンの設定と現在時刻の影響

MySQLの現在のタイムゾーンを確認する

システム全体のデフォルトタイムゾーンを確認

SHOW VARIABLES LIKE '%time_zone%';
実行結果(例)
+-----------------+--------+
| Variable_name   | Value  |
+-----------------+--------+
| system_time_zone | UTC    |
| time_zone       | +00:00 |
+-----------------+--------+

MySQLのタイムゾーンを変更する

セッションごとにタイムゾーンを変更

SET SESSION time_zone = 'Asia/Tokyo';

サーバー全体のタイムゾーンを変更(my.cnf に設定)

[mysqld]
default-time-zone = '+09:00'

設定後にMySQLを再起動

sudo systemctl restart mysql

UTC時刻を取得する方法

SELECT UTC_TIMESTAMP();
実行結果(例)
2025-02-01 14:30:45

CONVERT_TZ() で異なるタイムゾーンへ変換

SELECT CONVERT_TZ(NOW(), 'Asia/Tokyo', 'UTC');
実行結果
2025-02-01 14:30:45

ユーザーごとに異なるタイムゾーンを設定する

ユーザーのタイムゾーンに変換

SELECT CONVERT_TZ(NOW(), 'UTC', 'America/New_York');
実行結果(例)
2025-02-01 09:30:45

TIMESTAMP 型と DATETIME 型の違い

データ型タイムゾーンの影響
TIMESTAMP影響を受ける(UTC変換される)UTCに変換されて保存される
DATETIME影響を受けない(固定値)YYYY-MM-DD HH:MM:SS のまま

TIMESTAMPDATETIME のデータ保存例

CREATE TABLE time_test (
    ts_column TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    dt_column DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO time_test () VALUES ();
SELECT * FROM time_test;
実行結果(例)
+---------------------+---------------------+
| ts_column          | dt_column           |
+---------------------+---------------------+
| 2025-02-01 14:30:45 | 2025-02-01 23:30:45 |
+---------------------+---------------------+

まとめ

  • 現在のタイムゾーンを確認SHOW VARIABLES LIKE '%time_zone%';
  • セッションごとに変更SET SESSION time_zone = 'Asia/Tokyo';
  • サーバー全体のデフォルト変更default-time-zone = '+09:00'my.cnf に設定
  • UTC時刻を取得SELECT UTC_TIMESTAMP();
  • タイムゾーン変換SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
  • TIMESTAMP はタイムゾーンの影響を受けるが、DATETIME は固定

6. 実践的な活用例(現場で役立つMySQLの現在時刻の使い方)

ログ管理(データの作成日時・更新日時を記録)

テーブルを作成(作成日時と更新日時を含む)

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

データを挿入

INSERT INTO logs (event) VALUES ('ユーザーがログインしました');

データを更新

UPDATE logs SET event = 'ユーザーがパスワードを変更しました' WHERE id = 1;

スケジュール管理(未来の日付の自動計算)

1週間後に予定を設定

INSERT INTO schedule (event_name, event_date) 
VALUES ('プロジェクトの締切', DATE_ADD(NOW(), INTERVAL 7 DAY));

特定期間のデータを抽出する

今月のデータを取得

SELECT * FROM orders 
WHERE order_date BETWEEN DATE_FORMAT(CURDATE(), '%Y-%m-01') AND LAST_DAY(CURDATE());

アクセス履歴の記録

アクセスログを記録するテーブル

CREATE TABLE access_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    access_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

ユーザーのアクセスを記録

INSERT INTO access_logs (user_id) VALUES (123);

データの有効期限を管理する

30日以上前のデータを削除

DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);

まとめ

活用シーン使う関数具体例
ログ管理CURRENT_TIMESTAMPcreated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
スケジュール管理DATE_ADD()INSERT INTO schedule VALUES (DATE_ADD(NOW(), INTERVAL 7 DAY));
特定期間のデータ取得BETWEEN, CURDATE()SELECT * FROM orders WHERE order_date BETWEEN DATE_FORMAT(CURDATE(), '%Y-%m-01') AND LAST_DAY(CURDATE());
アクセス履歴の記録TIMESTAMPINSERT INTO access_logs (user_id) VALUES (123);
古いデータの削除DATE_SUB()DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);

7. よくあるエラーとトラブルシューティング

NOW() が正しいタイムゾーンで取得できない

原因

  • MySQLのデフォルトタイムゾーンがUTCになっている
  • セッションごとのタイムゾーン設定が正しくない

解決策

現在のタイムゾーンを確認
SHOW VARIABLES LIKE '%time_zone%';
タイムゾーンを一時的に変更
SET SESSION time_zone = 'Asia/Tokyo';
サーバー全体のデフォルトタイムゾーンを変更
[mysqld]
default-time-zone = '+09:00'

MySQLを再起動すると変更が適用されます。

CURRENT_TIMESTAMP が意図しない日時を返す

原因

  • TIMESTAMP 型のカラムを使用している(タイムゾーンの影響を受ける)
  • サーバーのタイムゾーンがUTCになっている

解決策

DATETIME 型を使用すると、タイムゾーンの影響を受けない
CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
TIMESTAMP 型を使う場合は、CONVERT_TZ() で変換
SELECT CONVERT_TZ(event_time, 'UTC', 'Asia/Tokyo') FROM logs;

TIMESTAMPDIFF() の結果が期待と異なる

原因

  • TIMESTAMPDIFF() は単位ごとに丸めて計算する
  • 例: TIMESTAMPDIFF(DAY, '2025-02-01 23:59:59', '2025-02-02 00:00:01')0日

解決策

  • より正確な秒単位の計算をする
SELECT TIMESTAMPDIFF(SECOND, '2025-02-01 23:59:59', '2025-02-02 00:00:01');
実行結果
2

TIMESTAMPDATETIME の使い分け

データ型タイムゾーンの影響推奨用途
TIMESTAMP影響を受ける(UTC変換される)世界中のユーザーが使うシステム
DATETIME影響を受けない(固定値)ローカル時間を厳密に管理
TIMESTAMP を使用する場合
CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
DATETIME を使用する場合
CREATE TABLE reservations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    reserved_at DATETIME NOT NULL
);

まとめ

エラー内容原因解決策
NOW() の時刻がずれるサーバーのタイムゾーン設定が異なるSET SESSION time_zone = 'Asia/Tokyo';
CURRENT_TIMESTAMP が意図しない日時を返すTIMESTAMP 型の影響DATETIME 型を使用
TIMESTAMPDIFF() の結果が期待と異なる丸め誤差の影響TIMESTAMPDIFF(SECOND, 日時1, 日時2) を使用
TIMESTAMPDATETIME の違いが分からないタイムゾーンの影響有無TIMESTAMP はUTC変換されるが、DATETIME は固定

MySQLの現在時刻を扱う際は、環境設定やデータ型の特性を理解することで、予期しないエラーを防ぐことができます。

8. FAQ(よくある質問と回答)

NOW()CURRENT_TIMESTAMP の違いは?

回答

基本的にはどちらも同じ機能を持ちますが、カラムのデフォルト値として設定する際には CURRENT_TIMESTAMP のみが使用可能 です。

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

MySQLで現在時刻をUTCで取得するには?

回答

以下のクエリを使えば、MySQLのタイムゾーン設定に関係なく、UTCの現在時刻を取得 できます。

SELECT UTC_TIMESTAMP();

また、NOW() の結果をUTCに変換したい場合は CONVERT_TZ() を使います。

SELECT CONVERT_TZ(NOW(), 'Asia/Tokyo', 'UTC');

日付と時刻を別々のカラムに保存すべき?

回答

  • 日時を一緒に保存したい(ログ、予約管理)
  CREATE TABLE reservations (
      id INT AUTO_INCREMENT PRIMARY KEY,
      reserved_at DATETIME NOT NULL
  );
  • 日付と時刻を別々に管理したい(勤務表など)
  CREATE TABLE work_schedules (
      id INT AUTO_INCREMENT PRIMARY KEY,
      work_date DATE NOT NULL,
      work_time TIME NOT NULL
  );

NOW() のタイムゾーンがずれるのはなぜ?

回答

まず、現在の設定を確認しましょう。

SHOW VARIABLES LIKE '%time_zone%';

設定を変更する場合:

SET SESSION time_zone = 'Asia/Tokyo';

NOW() の精度をミリ秒単位にできる?

回答

MySQL 5.6 以降では、小数秒(ミリ秒)を取得できます。

SELECT NOW(3);
実行結果(例)
2025-02-01 14:30:45.123

ミリ秒単位でデータを保存する場合

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_time DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3)
);

まとめ

  • NOW()CURRENT_TIMESTAMP は基本的に同じだが、カラムのデフォルト値には CURRENT_TIMESTAMP を使用
  • UTC時刻を取得するには UTC_TIMESTAMP() を使う
  • DATETIME は固定値、TIMESTAMP はタイムゾーン変換される
  • ミリ秒単位の取得には NOW(3) を使用
  • タイムゾーンがずれる場合は SET SESSION time_zone = 'Asia/Tokyo'; を実行

9. まとめ

MySQLで現在時刻を取得する方法

NOW()現在の日時(YYYY-MM-DD HH:MM:SS)を取得
CURRENT_TIMESTAMPカラムのデフォルト値に使用可能
CURDATE()今日の日付のみを取得
CURTIME()現在の時刻のみを取得
UTC_TIMESTAMP()常にUTCの時刻を取得

MySQLの現在時刻をフォーマットする方法

DATE_FORMAT() を使うことで、日時を見やすい形式に変換 できる。

SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H時%i分');

MySQLの現在時刻を使った日時計算

未来の日付を取得

SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);

過去の日付を取得

SELECT DATE_SUB(NOW(), INTERVAL 30 DAY);

2つの日付の差を計算

SELECT TIMESTAMPDIFF(DAY, '2025-01-01', NOW());

時間を秒数に変換

SELECT TIME_TO_SEC('01:30:00');

タイムゾーンの管理

現在のタイムゾーンを確認

SHOW VARIABLES LIKE '%time_zone%';

タイムゾーンを日本時間(JST)に変更

SET SESSION time_zone = 'Asia/Tokyo';

UTC時刻を取得する方法

SELECT UTC_TIMESTAMP();

タイムゾーンを考慮した時間変換

SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');

実践的な活用例

ログ管理(作成・更新日時の自動記録)

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

スケジュール管理(未来の日付の計算)

INSERT INTO schedule (event_name, event_date) 
VALUES ('プロジェクトの締切', DATE_ADD(NOW(), INTERVAL 7 DAY));

古いデータを削除(30日以上前のデータを削除)

DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);

この記事のポイント

📌 MySQLで現在時刻を取得する方法を網羅
📌 フォーマットや日時計算を活用する方法を解説
📌 実務で役立つ活用例(ログ管理・スケジュール管理など)を紹介
📌 よくあるエラーと対策を詳しく解説

MySQLでの時間管理は、ログの記録、データの有効期限管理、スケジュール管理など、さまざまな用途で役立ちます。
適切な関数を使いこなし、システムの要件に合わせた時刻処理を実装 できるようになりましょう。