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() が最も一般的に使用されるが、用途に応じて他の関数も活用できる!現在時刻のフォーマットと操作
取得した時刻を 見やすい形式に整えたり、特定の部分のみ取得する ことが重要です。 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 |
+------------+----------+
現在時刻を用いた計算
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
);
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', 'サーバー接続に失敗しました');
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で現在時刻を適切に扱うことは、ログ管理・データ集計・トランザクション処理 など、あらゆる場面で重要です。本記事で学んだ内容を活用し、より効率的なデータベース運用を実現してください!