【完全ガイド】MySQLで現在時刻を取得・操作・管理する方法|NOW()・CURRENT_TIMESTAMP の違いも解説

目次

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_TIMESTAMPUTCの日時 (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_TIMESTAMPNOW() とほぼ同じ働きをする関数です。

使い方

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_TIMESTAMPUTC日時 (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() では、以下のような記号を使って、日時のフォーマットを自由に変更できます。

指定子説明出力例
%Y4桁の年2025
%y2桁の年25
%m2桁の月(01〜12)02
%c1〜12の月2
%d2桁の日(01〜31)23
%e1〜31の日(先頭ゼロなし)23
%H24時間表記の時(00〜23)14
%h12時間表記の時(01〜12)02
%i分(00〜59)35
%s秒(00〜59)50
%pAM / 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_zonemy.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_TIMESTAMPON 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 の使用
DATETIME1000-01-01 00:00:009999-12-31 23:59:598バイトなし明示的に設定可能
TIMESTAMP1970-01-01 00:00:01 UTC2038-01-19 03:14:07 UTC4バイトありデフォルトで 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_TIMESTAMPDEFAULT に設定することで、レコード作成時に現在時刻を自動挿入できる。
  • ON UPDATE CURRENT_TIMESTAMP を設定すると、レコード更新時に自動的にタイムスタンプが更新される
  • DATETIMETIMESTAMP の違いを理解し、適切に使い分けることが重要。
  • 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_TIMESTAMPTIMESTAMPTIMESTAMP 型のカラムのデフォルト値に使用できる

特に CURRENT_TIMESTAMPTIMESTAMP 型のカラムに自動的に適用できるため、テーブル設計時に役立つ 場面が多いです。

NOW() で現在時刻を取得したいが、正しく動かない

Q: SELECT NOW(); を実行しても、時刻が思ったように取得できません。原因は何ですか?
A: 考えられる原因は以下の通りです。

  1. サーバーのタイムゾーンが適切に設定されていない
   SELECT @@global.time_zone, @@session.time_zone;

これでサーバーとセッションのタイムゾーンを確認し、必要に応じて変更しましょう。

   SET time_zone = 'Asia/Tokyo';
  1. MySQLの設定でタイムゾーンがSYSTEMになっている
  • SYSTEM の場合、OSのタイムゾーン設定に依存します。
  • そのため、MySQLとOSのタイムゾーン設定を統一することが重要です。

CURRENT_TIMESTAMP の時刻がずれる原因と解決策

Q: CURRENT_TIMESTAMP をデフォルト値として設定したのに、予想した時刻と異なる場合の原因は?
A: いくつかの要因が考えられます。

  1. データベースのタイムゾーンとアプリケーションのタイムゾーンが異なっている
  • SELECT @@global.time_zone, @@session.time_zone; で確認しましょう。
  • もし違っていたら、統一することを推奨します。
  1. 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_TIMESTAMPYYYY-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() を活用すれば 時刻を見やすい形式に変換 できる
INTERVALDATEDIFF() を使うと 日付・時間の計算 が可能
TIMESTAMP 型を使えば 作成日時・更新日時を自動記録 できる
✅ タイムゾーンの管理を適切に行うことで 異なる地域の時刻を正しく扱える

MySQLで現在時刻を適切に扱うことは、ログ管理・データ集計・トランザクション処理 など、あらゆる場面で重要です。本記事で学んだ内容を活用し、より効率的なデータベース運用を実現してください!