- 1 1. はじめに
- 2 2. MySQLで現在時刻を取得する方法
- 3 3. MySQLの現在時刻をフォーマットする方法
- 4 4. MySQLの現在時刻を使った日時計算
- 5 5. タイムゾーンの設定と現在時刻の影響
- 6 6. 実践的な活用例(現場で役立つMySQLの現在時刻の使い方)
- 7 7. よくあるエラーとトラブルシューティング
- 8 8. FAQ(よくある質問と回答)
- 9 9. まとめ
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での時間管理は、ログの記録、データの有効期限管理、スケジュール管理など、さまざまな用途で役立ちます。
適切な関数を使いこなし、システムの要件に合わせた時刻処理を実装 できるようになりましょう。