- 1 1. はじめに
- 2 2. MySQLで現在時刻を取得する方法
- 3 3. 現在時刻のフォーマットと表示
- 4 4. 現在時刻を用いた日時計算
- 5 5. タイムゾーンの設定と管理
- 6 6. 現在時刻をデフォルト値として設定する方法
- 7 7. MySQLの現在時刻を活用した実用例
- 8 8. よくある質問(FAQ)
- 9 9. まとめ
1. はじめに
MySQLで現在時刻を取得する理由
データベースを利用する際、現在の日時を取得することは多くの場面で必要になります。例えば、以下のようなユースケースが考えられます。
- データの作成日時や更新日時の記録
記録を残すことで、データの変更履歴を管理しやすくなります。 - リアルタイムデータの分析
時系列データを扱う際、現在時刻を取得することで、データの処理がスムーズになります。 - 一定期間のデータを取得
例えば、「過去24時間以内に更新されたデータを取得する」といったクエリに現在時刻が必要です。
この記事の目的と概要
本記事では、MySQLで現在時刻を取得する方法について詳しく解説します。基本的な関数の紹介から、日時のフォーマット変更、計算方法、タイムゾーン管理まで、幅広くカバーします。特に、初心者の方が理解しやすいように、コード例を交えて説明していきます。
最も簡単な現在時刻取得方法(結論ファースト)
MySQLで現在の日時を取得する最も簡単な方法は、NOW()
関数を使用することです。以下のSQLを実行すると、現在の日時が取得できます。
SELECT NOW();
このクエリを実行すると、以下のような結果が得られます。
+---------------------+
| NOW() |
+---------------------+
| 2025-02-23 14:35:00 |
+---------------------+
このように、現在の「日付」と「時刻」を取得することができます。
ただし、MySQLには他にも SYSDATE()
や CURRENT_TIMESTAMP
などの関数があり、それぞれ特性が異なります。
2. MySQLで現在時刻を取得する方法
MySQLでは、現在の日時を取得するための関数がいくつか用意されています。それぞれの関数には異なる特性があるため、用途に応じて適切なものを選ぶ必要があります。
MySQLの現在時刻取得に使用できる関数
関数名 | 取得できるデータ | 特徴 |
---|---|---|
NOW() | 日時 (YYYY-MM-DD HH:MM:SS ) | クエリの実行時点の日時を返す |
SYSDATE() | 日時 (YYYY-MM-DD HH:MM:SS ) | クエリが評価された瞬間の日時を返す |
CURDATE() | 日付 (YYYY-MM-DD ) | 現在の日付のみを取得 |
CURTIME() | 時間 (HH:MM:SS ) | 現在の時間のみを取得 |
CURRENT_TIMESTAMP | 日時 (YYYY-MM-DD HH:MM:SS ) | NOW() とほぼ同じ |
UTC_TIMESTAMP | UTCの日時 (YYYY-MM-DD HH:MM:SS ) | タイムゾーンに関係なく UTC 時刻を返す |
NOW()
関数
NOW()
は、現在の日時を取得する最も一般的な関数です。
使い方
SELECT NOW();
出力例
+---------------------+
| NOW() |
+---------------------+
| 2025-02-23 14:35:00 |
+---------------------+
特徴
NOW()
は クエリの実行時点の時刻 を取得する。DATETIME
型のデータとして返される。
SYSDATE()
関数
SYSDATE()
も NOW()
と同様に現在の日時を取得する関数ですが、動作が異なります。
使い方
SELECT SYSDATE();
出力例
+---------------------+
| SYSDATE() |
+---------------------+
| 2025-02-23 14:35:02 |
+---------------------+
NOW()
との違い
関数名 | 取得タイミング |
---|---|
NOW() | クエリの開始時点 |
SYSDATE() | クエリの評価時点 |
例えば、以下のようなクエリを実行すると違いがわかります。
SELECT NOW(), SLEEP(2), NOW();
SELECT SYSDATE(), SLEEP(2), SYSDATE();
実行結果(例)
+---------------------+----------+---------------------+
| NOW() | SLEEP(2) | NOW() |
+---------------------+----------+---------------------+
| 2025-02-23 14:35:00 | 0 | 2025-02-23 14:35:00 |
+---------------------+----------+---------------------+
+---------------------+----------+---------------------+
| SYSDATE() | SLEEP(2) | SYSDATE() |
+---------------------+----------+---------------------+
| 2025-02-23 14:35:00 | 0 | 2025-02-23 14:35:02 |
+---------------------+----------+---------------------+
ポイント
NOW()
は クエリの実行開始時の時刻 を返す。SYSDATE()
は クエリの評価時点の時刻 を返すため、SLEEP(2)
などの遅延後に異なる値になる。
CURDATE()
と CURTIME()
CURDATE()
は現在の日付 (YYYY-MM-DD
) を取得し、CURTIME()
は現在の時刻 (HH:MM:SS
) を取得します。
使い方
SELECT CURDATE(), CURTIME();
出力例
+------------+----------+
| CURDATE() | CURTIME() |
+------------+----------+
| 2025-02-23 | 14:35:00 |
+------------+----------+
特徴
CURDATE()
は 日付のみ を取得するので、DATE
型として扱われる。CURTIME()
は 時間のみ を取得するので、TIME
型として扱われる。
CURRENT_TIMESTAMP
関数
CURRENT_TIMESTAMP
は NOW()
とほぼ同じ働きをする関数です。
使い方
SELECT CURRENT_TIMESTAMP;
出力例
+---------------------+
| CURRENT_TIMESTAMP |
+---------------------+
| 2025-02-23 14:35:00 |
+---------------------+
特徴
NOW()
とCURRENT_TIMESTAMP
は基本的に同じ値を返す。TIMESTAMP
型のカラムのデフォルト値として利用できる。
CREATE TABLE sample (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
UTC_TIMESTAMP()
関数
UTC_TIMESTAMP()
は、UTC(協定世界時)の現在時刻を取得します。
使い方
SELECT UTC_TIMESTAMP();
出力例(日本時間 JST = UTC+9)
+---------------------+
| UTC_TIMESTAMP() |
+---------------------+
| 2025-02-23 05:35:00 |
+---------------------+
特徴
- サーバーのタイムゾーンに関係なく、UTC 時刻を取得 できる。
- タイムゾーンを考慮した処理が必要な場合に便利。
関数の比較まとめ
関数名 | 取得データ | 取得タイミング | 主な用途 |
---|---|---|---|
NOW() | 日時 (YYYY-MM-DD HH:MM:SS ) | クエリ実行開始時 | 一般的な日時取得 |
SYSDATE() | 日時 (YYYY-MM-DD HH:MM:SS ) | クエリ評価時点 | クエリ内で異なる時刻を取得 |
CURDATE() | 日付 (YYYY-MM-DD ) | クエリ実行開始時 | 日付のみを扱う |
CURTIME() | 時間 (HH:MM:SS ) | クエリ実行開始時 | 時間のみを扱う |
CURRENT_TIMESTAMP | 日時 (YYYY-MM-DD HH:MM:SS ) | クエリ実行開始時 | NOW() と同じ、デフォルト値として使用可能 |
UTC_TIMESTAMP | UTC日時 (YYYY-MM-DD HH:MM:SS ) | クエリ実行開始時 | タイムゾーンに関係なく UTC の時刻を取得 |
3. 現在時刻のフォーマットと表示
MySQLで現在時刻を取得した後、デフォルトの YYYY-MM-DD HH:MM:SS
形式ではなく、特定のフォーマットで表示したい場合 があります。たとえば、「年だけを取得したい」「時間部分だけを表示したい」「YYYY/MM/DD の形式に変更したい」といったケースです。
MySQLでは、これを DATE_FORMAT()
関数 を使って実現できます。
DATE_FORMAT()
関数の基本
DATE_FORMAT()
は、指定した日時データを任意のフォーマットに変換する関数です。
構文
DATE_FORMAT(対象の日時, 'フォーマット指定')
例えば、NOW()
で取得した現在時刻を YYYY/MM/DD HH:MM
の形式に変更するには、以下のSQLを実行します。
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i');
出力例
+----------------------+
| DATE_FORMAT(NOW()) |
+----------------------+
| 2025/02/23 14:35 |
+----------------------+
ポイント
%Y
→ 4桁の年(例:2025)%m
→ 2桁の月(例:02)%d
→ 2桁の日(例:23)%H
→ 24時間表記の時(例:14)%i
→ 分(例:35)
DATE_FORMAT()
のフォーマット指定一覧
DATE_FORMAT()
では、以下のような記号を使って、日時のフォーマットを自由に変更できます。
指定子 | 説明 | 出力例 |
---|---|---|
%Y | 4桁の年 | 2025 |
%y | 2桁の年 | 25 |
%m | 2桁の月(01〜12) | 02 |
%c | 1〜12の月 | 2 |
%d | 2桁の日(01〜31) | 23 |
%e | 1〜31の日(先頭ゼロなし) | 23 |
%H | 24時間表記の時(00〜23) | 14 |
%h | 12時間表記の時(01〜12) | 02 |
%i | 分(00〜59) | 35 |
%s | 秒(00〜59) | 50 |
%p | AM / PM 表記 | PM |
よく使うフォーマット例
(1) YYYY/MM/DD
形式で表示
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d');
出力
+----------------------+
| DATE_FORMAT(NOW()) |
+----------------------+
| 2025/02/23 |
+----------------------+
(2) YYYY年MM月DD日
の日本語表記
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日');
出力
+----------------------+
| DATE_FORMAT(NOW()) |
+----------------------+
| 2025年02月23日 |
+----------------------+
(3) 12時間表記 (AM/PM) で表示
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %h:%i %p');
出力
+------------------------+
| DATE_FORMAT(NOW()) |
+------------------------+
| 2025-02-23 02:35 PM |
+------------------------+
時間部分・日付部分のみを取得
場合によっては、現在の日付だけ取得 したり、現在の時間だけを取得 したいケースがあります。
(1) 日付 (YYYY-MM-DD
) だけ取得
SELECT CURDATE();
出力
+------------+
| CURDATE() |
+------------+
| 2025-02-23 |
+------------+
(2) 時刻 (HH:MM:SS
) だけ取得
SELECT CURTIME();
出力
+----------+
| CURTIME() |
+----------+
| 14:35:50 |
+----------+
ミリ秒 (マイクロ秒) を含めたフォーマット
MySQL 5.6.4 以降では、NOW(6)
などの関数を使うことで マイクロ秒(小数点以下6桁) を取得することが可能です。
(1) マイクロ秒付きの現在時刻を取得
SELECT NOW(6);
出力
+----------------------------+
| NOW(6) |
+----------------------------+
| 2025-02-23 14:35:50.123456 |
+----------------------------+
(2) マイクロ秒を含むフォーマット
SELECT DATE_FORMAT(NOW(6), '%Y-%m-%d %H:%i:%s.%f');
出力
+------------------------------+
| DATE_FORMAT(NOW(6)) |
+------------------------------+
| 2025-02-23 14:35:50.123456 |
+------------------------------+
まとめ
DATE_FORMAT()
を使うと、日時を自由にフォーマット可能。CURDATE()
やCURTIME()
を使うと、日付や時刻のみ取得できる。- MySQL 5.6.4 以降ではマイクロ秒も扱える。
AM/PM
表記、YYYY/MM/DD
形式、YYYY年MM月DD日
など 様々なフォーマットに対応 できる。
4. 現在時刻を用いた日時計算
MySQLでは、現在時刻を基準にした日時の計算が可能です。たとえば、「1時間後の時刻を取得する」「3日前の日付を取得する」「2つの日時の差を求める」といった処理を行うことができます。
INTERVAL
を使った日時の加算・減算
MySQLでは、INTERVAL
を使って日時に対して加算・減算を行うことができます。
(1) 現在時刻から1時間後の時刻を取得
SELECT NOW() AS 現在時刻, NOW() + INTERVAL 1 HOUR AS 1時間後;
出力
+---------------------+---------------------+
| 現在時刻 | 1時間後 |
+---------------------+---------------------+
| 2025-02-23 14:35:00 | 2025-02-23 15:35:00 |
+---------------------+---------------------+
(2) 現在の日付から7日後の日付を取得
SELECT CURDATE() AS 今日, CURDATE() + INTERVAL 7 DAY AS 1週間後;
出力
+------------+------------+
| 今日 | 1週間後 |
+------------+------------+
| 2025-02-23 | 2025-03-02 |
+------------+------------+
(3) 現在の日付から3日前の日付を取得
SELECT CURDATE() AS 今日, CURDATE() - INTERVAL 3 DAY AS 3日前;
出力
+------------+------------+
| 今日 | 3日前 |
+------------+------------+
| 2025-02-23 | 2025-02-20 |
+------------+------------+
(4) 特定の日時から1ヶ月後の日付を取得
SELECT DATE_ADD('2025-02-23', INTERVAL 1 MONTH) AS 1ヶ月後;
出力
+------------+
| 1ヶ月後 |
+------------+
| 2025-03-23 |
+------------+
(5) 特定の日時から1年後の日付を取得
SELECT DATE_ADD('2025-02-23', INTERVAL 1 YEAR) AS 1年後;
出力
+------------+
| 1年後 |
+------------+
| 2026-02-23 |
+------------+
DATEDIFF()
による日付の差分計算
DATEDIFF()
関数を使うと、2つの日付の差を「日単位」で取得 できます。
(1) 2つの日付の差を求める
SELECT DATEDIFF('2025-03-01', '2025-02-23') AS 日数差;
出力
+--------+
| 日数差 |
+--------+
| 6 |
+--------+
(2) 現在の日付と特定の日付の差を求める
SELECT DATEDIFF(NOW(), '2025-01-01') AS 経過日数;
出力
+------------+
| 経過日数 |
+------------+
| 53 |
+------------+
TIMESTAMPDIFF()
を使った時間単位の差分計算
TIMESTAMPDIFF()
を使うと、時間・分・秒単位での差分計算 が可能です。
(1) 2つの日時の差を「時間単位」で求める
SELECT TIMESTAMPDIFF(HOUR, '2025-02-23 12:00:00', '2025-02-23 18:30:00') AS 時間差;
出力
+--------+
| 時間差 |
+--------+
| 6 |
+--------+
(2) 2つの日時の差を「分単位」で求める
SELECT TIMESTAMPDIFF(MINUTE, '2025-02-23 12:00:00', '2025-02-23 12:30:00') AS 分差;
出力
+------+
| 分差 |
+------+
| 30 |
+------+
(3) 2つの日時の差を「秒単位」で求める
SELECT TIMESTAMPDIFF(SECOND, '2025-02-23 12:00:00', '2025-02-23 12:00:45') AS 秒差;
出力
+------+
| 秒差 |
+------+
| 45 |
+------+
BETWEEN
を使った日付範囲の絞り込み
データベース内で「特定の期間内にあるデータを取得したい」といったケースでは、BETWEEN
を使うことで簡単に実現できます。
(1) 過去1週間のデータを取得
SELECT * FROM orders WHERE order_date BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE();
(このクエリは、過去7日間の注文データを取得)
(2) 2025年2月1日から2月15日までのデータを取得
SELECT * FROM orders WHERE order_date BETWEEN '2025-02-01' AND '2025-02-15';
まとめ
INTERVAL
を使うことで、日時の加算・減算が簡単にできる。DATEDIFF()
を使うと、日単位での差分計算が可能。TIMESTAMPDIFF()
を使えば、時間・分・秒単位での差分計算ができる。BETWEEN
を使うことで、特定の期間内のデータを簡単に取得できる。

5. タイムゾーンの設定と管理
MySQLでは、サーバーのデフォルトのタイムゾーンを基準に現在時刻を取得します。しかし、システムの仕様やグローバルなアプリケーションを開発する場合、異なるタイムゾーンでの時刻管理が必要になることがあります。
現在のタイムゾーンの確認方法
MySQLでは、現在設定されているタイムゾーンを以下のSQLで確認できます。
SELECT @@global.time_zone, @@session.time_zone;
出力例
+--------------------+------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+------------------+
| SYSTEM | SYSTEM |
+--------------------+------------------+
解説
@@global.time_zone
は サーバー全体のタイムゾーン を示します。@@session.time_zone
は 現在のセッションのタイムゾーン を示します。
デフォルトでは SYSTEM
になっており、OSのタイムゾーン設定を使用しています。
セッション単位でのタイムゾーン変更
MySQLでは、一時的にタイムゾーンを変更することができます。例えば、JST(日本標準時)に変更するには以下のSQLを実行します。
SET time_zone = 'Asia/Tokyo';
または、UTC(協定世界時)に設定するには次のようにします。
SET time_zone = '+00:00';
設定後にタイムゾーンを確認
SELECT @@session.time_zone;
出力例
+------------------+
| @@session.time_zone |
+------------------+
| Asia/Tokyo |
+------------------+
ポイント
- この設定は 現在のセッションのみ に適用され、接続を切断すると元に戻ります。
- 永続的に適用したい場合は、サーバーの設定を変更する必要があります(次のセクション参照)。
サーバー全体のデフォルトタイムゾーンを設定する方法
サーバー全体のデフォルトタイムゾーンを変更するには、MySQLの設定ファイル(my.cnf
または my.ini
)を編集し、default_time_zone
を設定します。
(1) 設定ファイルを編集
Linux の場合(my.cnf
):
[mysqld]
default_time_zone = 'Asia/Tokyo'
Windows の場合(my.ini
):
[mysqld]
default_time_zone = '+09:00'
(2) MySQLを再起動
設定変更後、MySQLサーバーを再起動します。
Linux:
sudo systemctl restart mysql
Windows:
net stop mysql
net start mysql
(3) 設定確認
SELECT @@global.time_zone;
出力例
+--------------------+
| @@global.time_zone |
+--------------------+
| Asia/Tokyo |
+--------------------+
UTC時刻の取得 (UTC_TIMESTAMP()
)
グローバルなシステムを構築する際には、サーバーのタイムゾーンに依存せず、統一されたUTC時刻を扱うことが重要 です。
MySQLでは、UTC_TIMESTAMP()
を使うと UTCの現在時刻 を取得できます。
SELECT UTC_TIMESTAMP();
出力例
+---------------------+
| UTC_TIMESTAMP() |
+---------------------+
| 2025-02-23 05:35:00 |
+---------------------+
ポイント
UTC_TIMESTAMP()
は タイムゾーンの影響を受けない。- タイムゾーンを指定せずにグローバルなデータを管理したい場合に便利。
CONVERT_TZ()
を使った時刻の変換
MySQLの CONVERT_TZ()
を使用すると、あるタイムゾーンの日時を別のタイムゾーンに変換できます。
(1) UTC から JST に変換
SELECT CONVERT_TZ('2025-02-23 05:35:00', '+00:00', '+09:00') AS 日本時間;
出力
+---------------------+
| 日本時間 |
+---------------------+
| 2025-02-23 14:35:00 |
+---------------------+
(2) タイムゾーンの名前を使用する場合
MySQLの time_zone
テーブルが設定されている場合、以下のようにタイムゾーン名を指定して変換できます。
SELECT CONVERT_TZ('2025-02-23 05:35:00', 'UTC', 'Asia/Tokyo');
出力
+---------------------+
| 日本時間 |
+---------------------+
| 2025-02-23 14:35:00 |
+---------------------+
(3) MySQLのタイムゾーンデータを更新する
MySQLで CONVERT_TZ()
を使用する際、time_zone
テーブルが空の場合があります。その場合、以下のコマンドでデータを更新できます(Linux環境)。
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
まとめ
SELECT @@global.time_zone, @@session.time_zone;
で現在のタイムゾーンを確認できる。SET time_zone = 'Asia/Tokyo';
で セッション単位のタイムゾーン変更 が可能。default_time_zone
をmy.cnf
に設定し、MySQLを再起動すると サーバー全体のタイムゾーンを変更 できる。UTC_TIMESTAMP()
を使用すると、サーバーのタイムゾーンに関係なく UTC時刻を取得 できる。CONVERT_TZ()
を使うと、異なるタイムゾーン間の変換 ができる。
6. 現在時刻をデフォルト値として設定する方法
データベースの設計では、テーブルの特定のカラムに「デフォルトで現在時刻をセットする」ことが求められることが多くあります。例えば、レコードの作成日時や更新日時を自動的に記録する場合などです。
CURRENT_TIMESTAMP
をデフォルト値として設定
MySQLでは、TIMESTAMP
型または DATETIME
型のカラムに CURRENT_TIMESTAMP
をデフォルト値として設定できます。これにより、レコードが挿入される際に自動的に現在時刻がセットされます。
(1) CURRENT_TIMESTAMP
をデフォルト値にする
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
このテーブルにデータを挿入すると、created_at
カラムには自動的に現在時刻が設定されます。
INSERT INTO users (name) VALUES ('Alice');
SELECT * FROM users;
出力
+----+-------+---------------------+
| id | name | created_at |
+----+-------+---------------------+
| 1 | Alice | 2025-02-23 14:35:00 |
+----+-------+---------------------+
ON UPDATE CURRENT_TIMESTAMP
による自動更新
CURRENT_TIMESTAMP
は ON UPDATE
句と組み合わせることで、レコードが更新された際に自動的に現在時刻をセットできます。
(1) ON UPDATE CURRENT_TIMESTAMP
を設定
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
created_at
はレコード作成時に 初回のみ 現在時刻がセットされる。updated_at
はレコード更新時に 自動的に現在時刻に更新される。
(2) データの挿入
INSERT INTO users (name) VALUES ('Bob');
SELECT * FROM users;
出力
+----+------+---------------------+---------------------+
| id | name | created_at | updated_at |
+----+------+---------------------+---------------------+
| 1 | Bob | 2025-02-23 14:40:00 | 2025-02-23 14:40:00 |
+----+------+---------------------+---------------------+
(3) データを更新
UPDATE users SET name = 'Bobby' WHERE id = 1;
SELECT * FROM users;
出力
+----+-------+---------------------+---------------------+
| id | name | created_at | updated_at |
+----+-------+---------------------+---------------------+
| 1 | Bobby | 2025-02-23 14:40:00 | 2025-02-23 14:42:10 |
+----+-------+---------------------+---------------------+
このように、updated_at
の値が自動的に更新されています。
DATETIME
型と TIMESTAMP
型の違い
MySQLでは、日付・時刻を扱うために DATETIME
型と TIMESTAMP
型の2種類があります。それぞれの特徴を理解し、適切に使い分けることが重要です。
型 | 格納範囲 | ストレージサイズ | タイムゾーンの影響 | CURRENT_TIMESTAMP の使用 |
---|---|---|---|---|
DATETIME | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8バイト | なし | 明示的に設定可能 |
TIMESTAMP | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 4バイト | あり | デフォルトで CURRENT_TIMESTAMP 可 |
使い分けのポイント
DATETIME
を使うべき場合- タイムゾーンの影響を受けたくない(固定の日時を保存したい)。
- 2038年以降のデータを扱う可能性がある。
TIMESTAMP
を使うべき場合- MySQLのデフォルトのタイムゾーンに応じた時間を扱いたい。
CURRENT_TIMESTAMP
をデフォルト値として使用したい(DATETIME
では明示的な設定が必要)。
NOW()
をデフォルト値に設定できない理由
CURRENT_TIMESTAMP
はデフォルト値として使用できますが、NOW()
関数はデフォルト値として直接設定できません。
(1) NOW()
をデフォルト値に設定しようとするとエラー
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at DATETIME DEFAULT NOW()
);
エラー
ERROR 1067 (42000): Invalid default value for 'created_at'
このエラーは、NOW()
が関数であるため、デフォルト値として直接使用できないことを示しています。
(2) 解決策
代わりに CURRENT_TIMESTAMP
を使用します。
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
また、NOW()
を使いたい場合は BEFORE INSERT
トリガー を使用することも可能です。
CREATE TRIGGER set_created_at BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();
まとめ
CURRENT_TIMESTAMP
をDEFAULT
に設定することで、レコード作成時に現在時刻を自動挿入できる。ON UPDATE CURRENT_TIMESTAMP
を設定すると、レコード更新時に自動的にタイムスタンプが更新される。DATETIME
とTIMESTAMP
の違いを理解し、適切に使い分けることが重要。NOW()
はデフォルト値にできないが、CURRENT_TIMESTAMP
を使うことで代用可能。BEFORE INSERT
トリガーを使用すれば、NOW()
をデフォルト値のように扱うこともできる。
7. MySQLの現在時刻を活用した実用例
MySQLで現在時刻を取得・操作する方法を学んだところで、次は 実際の業務や開発でどのように活用できるのか を具体的に見ていきましょう。
このセクションでは、以下の実用例を紹介します。
- ログ記録に現在時刻を追加
- 過去24時間のデータを取得
- ユーザーの最終ログイン時刻を更新
- データの作成日時・更新日時を自動記録
- 一定期間内のデータを取得するSQL
ログ記録に現在時刻を追加
システムのログやエラーログを記録する際、発生日時とともに保存することが一般的です。これにより、トラブルシューティングが容易になります。
(1) ログテーブルの作成
CREATE TABLE system_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event_type VARCHAR(255),
message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
(2) ログを追加
INSERT INTO system_logs (event_type, message)
VALUES ('ERROR', 'サーバー接続に失敗しました');
(3) 最新のログを取得
SELECT * FROM system_logs ORDER BY created_at DESC LIMIT 10;
このように CURRENT_TIMESTAMP
を使用することで、ログの作成日時を自動的に記録できます。
過去24時間のデータを取得
ECサイトやユーザー管理システムなどでは、「過去24時間に発生したイベントや注文を取得したい」というケースが頻繁にあります。
(1) 過去24時間以内に登録されたユーザーを取得
SELECT * FROM users WHERE created_at >= NOW() - INTERVAL 1 DAY;
このクエリを実行すると、現在時刻から 過去24時間以内に登録されたユーザー を取得できます。
(2) 過去24時間の注文を取得
SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 1 DAY;
ユーザーの最終ログイン時刻を更新
ユーザーがログインするたびに、最終ログイン時刻を更新することで、アクティブユーザーの管理 が可能になります。
(1) ユーザーテーブルの作成
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255),
last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
last_login
はユーザーがログインするたびに 自動更新 されます。
(2) ユーザーがログインした際にログイン時刻を更新
UPDATE users SET last_login = NOW() WHERE id = 1;
(3) 最終ログインが1週間以上前のユーザーを取得
SELECT * FROM users WHERE last_login < NOW() - INTERVAL 7 DAY;
このクエリを使えば、「最後のログインが1週間以上前のユーザー」を抽出できます。
データの作成日時・更新日時を自動記録
データベースでは、「レコードの作成日時・更新日時を自動的に管理する」のが一般的です。
(1) 自動的に作成・更新時刻を記録するテーブル
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
created_at
→ レコード作成時に自動セットupdated_at
→ レコードが更新されるたびに自動更新
(2) 新しい記事を追加
INSERT INTO articles (title, content)
VALUES ('MySQLの現在時刻の使い方', 'MySQLのNOW()関数について詳しく解説します。');
(3) 記事の内容を更新
UPDATE articles SET content = 'NOW()だけでなく、CURRENT_TIMESTAMPも詳しく解説します。'
WHERE id = 1;
このようにすると、レコードを更新するたびに updated_at
が自動的に変更されるため、手動で更新日時をセットする必要がなくなります。
一定期間内のデータを取得するSQL
特定の期間内に登録されたデータを取得することは、売上分析やユーザーアクティビティの計測に役立ちます。
(1) 指定された期間内の注文を取得
SELECT * FROM orders WHERE order_date BETWEEN '2025-02-01' AND '2025-02-15';
このクエリは、2025年2月1日から2月15日までの注文を取得します。
(2) 1ヶ月以内に登録されたユーザーを取得
SELECT * FROM users WHERE created_at >= NOW() - INTERVAL 1 MONTH;
INTERVAL 1 MONTH
を使うことで、「過去1ヶ月以内に登録されたユーザー」を取得できます。
まとめ
CURRENT_TIMESTAMP
を使うことで、ログやイベントの作成時刻を自動記録できる。NOW() - INTERVAL X DAY
を使えば、過去X日間のデータを簡単に取得 できる。ON UPDATE CURRENT_TIMESTAMP
を利用すると、ユーザーの最終ログイン時刻を自動管理 できる。BETWEEN
を使うと、特定の期間内のデータを取得 できる。- データの作成・更新日時の管理には
TIMESTAMP
を活用すると便利。
8. よくある質問(FAQ)
MySQLの現在時刻に関する操作を行う際には、いくつかの疑問やトラブルに直面することがあります。このセクションでは、よくある質問とその解決方法 をQ&A形式で解説します。
NOW()
と CURRENT_TIMESTAMP
は何が違うのか?
Q: NOW()
と CURRENT_TIMESTAMP
はどちらも現在時刻を取得できますが、違いはありますか?
A: ほぼ同じ動作をしますが、わずかな違いがあります。
関数名 | 返されるデータ型 | 主な違い |
---|---|---|
NOW() | DATETIME | クエリ実行時の時刻を返す |
CURRENT_TIMESTAMP | TIMESTAMP | TIMESTAMP 型のカラムのデフォルト値に使用できる |
特に CURRENT_TIMESTAMP
は TIMESTAMP
型のカラムに自動的に適用できるため、テーブル設計時に役立つ 場面が多いです。
NOW()
で現在時刻を取得したいが、正しく動かない
Q: SELECT NOW();
を実行しても、時刻が思ったように取得できません。原因は何ですか?
A: 考えられる原因は以下の通りです。
- サーバーのタイムゾーンが適切に設定されていない
SELECT @@global.time_zone, @@session.time_zone;
これでサーバーとセッションのタイムゾーンを確認し、必要に応じて変更しましょう。
SET time_zone = 'Asia/Tokyo';
- MySQLの設定でタイムゾーンが
SYSTEM
になっている
SYSTEM
の場合、OSのタイムゾーン設定に依存します。- そのため、MySQLとOSのタイムゾーン設定を統一することが重要です。
CURRENT_TIMESTAMP
の時刻がずれる原因と解決策
Q: CURRENT_TIMESTAMP
をデフォルト値として設定したのに、予想した時刻と異なる場合の原因は?
A: いくつかの要因が考えられます。
- データベースのタイムゾーンとアプリケーションのタイムゾーンが異なっている
SELECT @@global.time_zone, @@session.time_zone;
で確認しましょう。- もし違っていたら、統一することを推奨します。
TIMESTAMP
型はDATETIME
型と異なり、サーバーのタイムゾーンの影響を受ける
- タイムゾーンの影響を避けたい場合は、
DATETIME
型を使用するとよいでしょう。
NOW()
をデフォルト値に設定できない理由
Q: NOW()
をデフォルト値に設定しようとするとエラーになります。なぜですか?
A: NOW()
は関数であり、MySQLでは デフォルト値として関数を使用できない という制約があります。
エラー例
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at DATETIME DEFAULT NOW()
);
ERROR 1067 (42000): Invalid default value for 'created_at'
✅ 解決策
代わりに CURRENT_TIMESTAMP
を使用しましょう。
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
または、トリガーを使用 する方法もあります。
CREATE TRIGGER set_created_at BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();
BETWEEN
を使った範囲指定がうまくいかない場合の対処法
Q: BETWEEN
を使って特定の範囲のデータを取得しようとしたが、正しく動作しません。
A: BETWEEN
を使う際に データ型の違いや時刻の切り捨て などが原因で予想通りの結果にならないことがあります。
(1) BETWEEN
の正しい使い方
たとえば、「2025年2月1日から2月10日までのデータを取得」する場合:
SELECT * FROM orders WHERE order_date BETWEEN '2025-02-01 00:00:00' AND '2025-02-10 23:59:59';
ポイント
BETWEEN '2025-02-01' AND '2025-02-10'
のように 時刻を省略すると 00:00:00 で判定される ため、意図しない結果になることがある。23:59:59
を明示的に指定すると、日付の終わりまで正しく範囲指定できる。
SYSDATE()
を使うべきケースと使わないほうがよいケース
Q: SYSDATE()
は NOW()
と何が違うの? どんなときに使うべき?
A: SYSDATE()
は NOW()
に似ていますが、クエリの実行時点ではなく、評価されるタイミングの時刻を取得 するという点が異なります。
(1) NOW()
の場合
SELECT NOW(), SLEEP(2), NOW();
出力
+---------------------+----------+---------------------+
| NOW() | SLEEP(2) | NOW() |
+---------------------+----------+---------------------+
| 2025-02-23 14:00:00 | 0 | 2025-02-23 14:00:00 |
+---------------------+----------+---------------------+
(2) SYSDATE()
の場合
SELECT SYSDATE(), SLEEP(2), SYSDATE();
出力
+---------------------+----------+---------------------+
| SYSDATE() | SLEEP(2) | SYSDATE() |
+---------------------+----------+---------------------+
| 2025-02-23 14:00:00 | 0 | 2025-02-23 14:00:02 |
+---------------------+----------+---------------------+
✅ SYSDATE()
を使うべきケース
- トランザクションの中で、各クエリの実行時刻を厳密に記録したい場合。
- ログやリアルタイムデータを記録する際、正確なタイミングを求める場合。
まとめ
NOW()
とCURRENT_TIMESTAMP
はほぼ同じだが、TIMESTAMP
型で使用するならCURRENT_TIMESTAMP
が便利。BETWEEN
で日付範囲を指定する際は23:59:59
まで含めること。SYSDATE()
はリアルタイムの時刻が必要な場面で活用すると便利。
9. まとめ
これまでのセクションで、MySQLで現在時刻を取得・操作・管理する方法 を詳しく解説してきました。この最終セクションでは、各ポイントを振り返り、MySQLで現在時刻を適切に扱うための重要なポイントを整理します。
MySQLの現在時刻を取得する方法まとめ
関数名 | 取得できるデータ | 取得タイミング | 主な用途 |
---|---|---|---|
NOW() | YYYY-MM-DD HH:MM:SS | クエリ実行時 | 一般的な現在時刻取得 |
SYSDATE() | YYYY-MM-DD HH:MM:SS | クエリ評価時 | リアルタイムの時刻取得 |
CURDATE() | YYYY-MM-DD | クエリ実行時 | 現在の日付のみ取得 |
CURTIME() | HH:MM:SS | クエリ実行時 | 現在の時間のみ取得 |
CURRENT_TIMESTAMP | YYYY-MM-DD HH:MM:SS | クエリ実行時 | NOW() とほぼ同じ |
UTC_TIMESTAMP() | YYYY-MM-DD HH:MM:SS (UTC) | クエリ実行時 | UTCの現在時刻を取得 |
✅ NOW()
が最も一般的に使用されるが、用途に応じて他の関数も活用できる!
現在時刻のフォーマットと操作
取得した時刻を 見やすい形式に整えたり、特定の部分のみ取得する ことが重要です。
DATE_FORMAT()
を使ってフォーマット
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i:%s');
出力
2025年02月23日 14:35:00
- 日付・時間部分のみを取得
SELECT CURDATE(), CURTIME();
出力
+------------+----------+
| 2025-02-23 | 14:35:00 |
+------------+----------+
現在時刻を用いた計算
INTERVAL
を使って時間を加算・減算
SELECT NOW() + INTERVAL 1 HOUR; -- 1時間後
SELECT NOW() - INTERVAL 3 DAY; -- 3日前
- 日数の差を求める
SELECT DATEDIFF('2025-03-01', '2025-02-23');
出力
6日
- 時間の差を求める
SELECT TIMESTAMPDIFF(HOUR, '2025-02-23 12:00:00', '2025-02-23 18:30:00');
出力
6時間
タイムゾーンの管理
- 現在のタイムゾーンを確認
SELECT @@global.time_zone, @@session.time_zone;
- セッション単位でタイムゾーンを変更
SET time_zone = 'Asia/Tokyo';
- 異なるタイムゾーンの変換
SELECT CONVERT_TZ('2025-02-23 05:35:00', 'UTC', 'Asia/Tokyo');
出力
2025-02-23 14:35:00
現在時刻をデフォルト値として設定
- レコード作成時の日時を自動記録
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
- 更新時に
updated_at
を自動更新
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
MySQLの現在時刻の実用例
- ログ記録
INSERT INTO system_logs (event_type, message)
VALUES ('ERROR', 'サーバー接続に失敗しました');
- 過去24時間以内のデータを取得
SELECT * FROM users WHERE created_at >= NOW() - INTERVAL 1 DAY;
- 最終ログイン時刻の更新
UPDATE users SET last_login = NOW() WHERE id = 1;
- 一定期間内のデータを取得
SELECT * FROM orders WHERE order_date BETWEEN '2025-02-01' AND '2025-02-15';
次にやるべきこと
- MySQLで現在時刻を取得するSQLを試してみる(
SELECT NOW();
など) - 日付の計算やフォーマットを使って、実際にSQLを組み立ててみる
- 実際のアプリケーションに適用する(ログ記録、ユーザー管理など)
総括
✅ NOW()
や CURRENT_TIMESTAMP
を使えば 簡単に現在時刻を取得 できる
✅ DATE_FORMAT()
を活用すれば 時刻を見やすい形式に変換 できる
✅ INTERVAL
や DATEDIFF()
を使うと 日付・時間の計算 が可能
✅ TIMESTAMP
型を使えば 作成日時・更新日時を自動記録 できる
✅ タイムゾーンの管理を適切に行うことで 異なる地域の時刻を正しく扱える
MySQLで現在時刻を適切に扱うことは、ログ管理・データ集計・トランザクション処理 など、あらゆる場面で重要です。本記事で学んだ内容を活用し、より効率的なデータベース運用を実現してください!