1. はじめに
MySQLで現在時刻を扱う重要性
MySQLは、データベースに格納される情報を適切に管理するために、時間の取り扱いが非常に重要です。特に現在時刻を取得・操作する機能は、ログの記録、スケジュールの管理、データの更新タイミングの記録など、多くの場面で利用されます。 例えば、次のようなケースで現在時刻を活用できます。- 注文管理システム: 注文日時を自動記録
- ログ管理: システムのエラーログやアクセスログの記録
- スケジュール機能: 未来の予定をデータベースに保存し、リマインドを送信
このように、MySQLで現在時刻を適切に扱うことは、データの整合性や分析精度を向上させるために非常に重要です。「MySQL 現在時刻」を知りたいユーザーの目的とは?
「MySQL 現在時刻」と検索するユーザーの多くは、以下のような目的を持っています。- 現在時刻を取得したい
- 取得した時刻をフォーマットしたい
- 時刻を操作(加算・減算)したい
- 特定の時刻範囲でデータを検索したい
- タイムゾーンを考慮して時刻を扱いたい
これらのニーズを満たすために、本記事では MySQLで現在時刻を取得する方法 を基礎から応用まで詳しく解説します。この記事で学べること
本記事では、以下のポイントを体系的に学ぶことができます。- MySQLで現在時刻を取得する基本的な方法
- 現在時刻のフォーマット変更方法
- 日時計算(加算・減算)を行う方法
- タイムゾーンを考慮した時刻の扱い方
- 実践的な活用例(ログ管理・スケジュール管理など)
この情報を活用することで、MySQLのデータ管理をより効率的に行うことができるようになります。
2. MySQLで現在時刻を取得する方法
MySQLで現在時刻を取得する主な方法
MySQLで現在時刻を取得する方法はいくつかあります。主に NOW() 関数を使いますが、用途に応じて CURRENT_TIMESTAMP や CURDATE(), CURTIME() も利用できます。NOW() を使用して現在時刻を取得する
NOW() の基本構文
SELECT NOW();
実行結果(例)
2025-02-01 15:30:45
NOW() は現在の日時を YYYY-MM-DD HH:MM:SS の形式で取得します。CURRENT_TIMESTAMP の利用
CURRENT_TIMESTAMP も NOW() と同じ結果を返します。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_TIMESTAMP | NOW()と同じ(カラムのデフォルト値に適用可) | テーブル作成時のデフォルト値 |
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 |
%p | AM/PM | PM |
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 数値 時間単位);
| 時間単位 | 意味 | 例 |
|---|
| SECOND | 秒 | DATE_ADD(NOW(), INTERVAL 30 SECOND) |
| MINUTE | 分 | DATE_ADD(NOW(), INTERVAL 10 MINUTE) |
| HOUR | 時 | DATE_ADD(NOW(), INTERVAL 2 HOUR) |
| DAY | 日 | DATE_ADD(NOW(), INTERVAL 7 DAY) |
| MONTH | 月 | DATE_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 のまま |
TIMESTAMP と DATETIME のデータ保存例
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_TIMESTAMP | created_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()); |
| アクセス履歴の記録 | TIMESTAMP | INSERT 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
TIMESTAMP と DATETIME の使い分け
| データ型 | タイムゾーンの影響 | 推奨用途 |
|---|
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) を使用 |
TIMESTAMP と DATETIME の違いが分からない | タイムゾーンの影響有無 | 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での時間管理は、ログの記録、データの有効期限管理、スケジュール管理など、さまざまな用途で役立ちます。 適切な関数を使いこなし、システムの要件に合わせた時刻処理を実装 できるようになりましょう。