【MySQL】現在時刻を取得する方法と使い方|NOW()・SYSDATE()・CURTIME()の違いを解説

目次

1. はじめに

MySQLで現在時刻を取得することは、データベース管理において非常に重要な要素です。
たとえば、以下のような場面で現在時刻を取得する必要があります。

  • データ挿入時に作成日時を自動記録(例:新規ユーザー登録時のタイムスタンプ)
  • ユーザーログイン時間の記録(例:ログイン履歴の管理)
  • 一定期間のデータを取得(例:過去24時間の注文履歴を取得)
  • システムの実行ログの記録(例:エラーログやイベントログの管理)

このように、データの管理やログ記録において「現在時刻」を適切に取得することは、データベースの運用において不可欠です。

本記事では、MySQLで現在時刻を取得する方法について、実際のSQLクエリを交えながら詳しく解説します。
また、よく使われる関数の違いや適切な使い分け、実用的なクエリ例についても紹介するので、初心者の方から中級者の方まで役立つ内容となっています。

2. MySQLで現在時刻を取得する関数一覧(比較表)

MySQLには現在時刻を取得するための関数が複数存在します。
用途によって適切な関数を選ぶことが重要ですが、それぞれの違いが分かりにくいと感じる方も多いでしょう。

このセクションでは、MySQLで現在時刻を取得する主要な関数を一覧表で比較し、それぞれの特性を詳しく解説します。

2.1 MySQLの時刻取得関数の比較表

関数名取得できる情報フォーマット特徴
NOW()現在の日時YYYY-MM-DD HH:MM:SS最も一般的に使用される
SYSDATE()実行時の日時YYYY-MM-DD HH:MM:SSNOW()と異なり、実行ごとに変化
CURTIME()現在の時刻HH:MM:SS日付なし、時刻のみ取得
CURRENT_TIME()現在の時刻HH:MM:SSCURTIME()と同じ
CURRENT_TIMESTAMP()現在の日時YYYY-MM-DD HH:MM:SSNOW()とほぼ同じ
UTC_TIMESTAMP()UTCの現在日時YYYY-MM-DD HH:MM:SSタイムゾーンがUTC固定

上記の表を見ると、ほとんどの関数が「現在の日時」や「現在の時刻」を取得するものですが、使用する目的に応じて選ぶべき関数が異なります

2.2 各関数の概要と特徴

NOW()関数

  • 現在の日時を取得する最も一般的な関数
  • SQLクエリを開始した時点の時刻を返す
  • データ挿入や更新の際のタイムスタンプ取得によく使用される
SELECT NOW();

実行結果(例)

2025-02-14 15:30:45

SYSDATE()関数

  • クエリ実行のタイミングで現在時刻を取得
  • NOW()との違いは、SYSDATE()は実行ごとに異なる時間を返す(トランザクション中でも変わる)
SELECT SYSDATE();

実行結果(例)

2025-02-14 15:30:47

CURTIME()関数

  • 時刻(HH:MM:SS)だけを取得
  • 日付が不要な場合に使用
SELECT CURTIME();

実行結果(例)

15:30:45

CURRENT_TIME()関数

  • CURTIME()と同じ動作をする
  • SQL標準に準拠した関数名
SELECT CURRENT_TIME();

実行結果(例)

15:30:45

CURRENT_TIMESTAMP()関数

  • NOW()と同じ動作
  • DEFAULT 値としてテーブルのカラムに指定可能(NOW()より適している)
SELECT CURRENT_TIMESTAMP();

実行結果(例)

2025-02-14 15:30:45

テーブル作成時にデフォルト値として設定:

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

UTC_TIMESTAMP()関数

  • UTC(協定世界時)の現在時刻を取得
  • サーバーのタイムゾーンに依存せず、一貫した時刻を取得可能
SELECT UTC_TIMESTAMP();

実行結果(例)

2025-02-14 06:30:45

2.3 どの関数を使うべきか?

使用シーン推奨関数
現在の日時を取得NOW()
トランザクションごとに異なる時刻を取得SYSDATE()
現在の時刻(HH:MM:SS のみ)が必要CURTIME() または CURRENT_TIME()
テーブルのデフォルト値として設定CURRENT_TIMESTAMP()
UTC(協定世界時)を取得UTC_TIMESTAMP()

基本的に、通常の日時取得なら NOW() を使えば問題なし!
ただし、用途に応じて適切な関数を選ぶことで、より柔軟なデータ操作が可能になります。

3. NOW()関数の詳細

MySQLのNOW()関数は、現在の日時(年月日+時刻)を取得する最も一般的な関数です。
データベースに保存する際や、特定の期間のデータを取得する際など、幅広い用途で使用されます。

3.1 NOW()関数の基本的な使い方

NOW()の構文

SELECT NOW();

実行結果(例)

2025-02-14 15:30:45
  • YYYY-MM-DD HH:MM:SS(年-月-日 時:分:秒)のフォーマットで出力される。
  • MySQLのデフォルトのタイムゾーン設定に基づいて時刻が取得される。

3.2 NOW()関数の用途

① データ挿入時に現在時刻を記録

データベースにデータを挿入する際、NOW()を使って作成日時を記録できます。

INSERT INTO users (name, created_at) VALUES ('佐藤', NOW());

② データ更新時に現在時刻を記録

UPDATE users SET last_login = NOW() WHERE id = 1;

③ 一定期間のデータを取得

SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 1 DAY;
  • INTERVAL 1 DAY を指定することで、「過去1日間のデータ」を取得。

3.3 NOW()関数の戻り値の型とフォーマット変更

NOW()の戻り値のデータ型

  • DATETIME 型(YYYY-MM-DD HH:MM:SS
  • 文字列として扱うことも可能
SELECT NOW(), typeof(NOW());

フォーマットを変更する方法

SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i:%s') AS formatted_time;

実行結果

2025/02/14 15:30:45

3.4 NOW()関数とSYSDATE()関数の違い

関数名取得タイミング特徴
NOW()クエリ開始時クエリが実行される時点の固定時刻を取得
SYSDATE()クエリ実行時クエリの実行ごとに異なる時刻を取得
SELECT NOW(), SLEEP(3), NOW();
SELECT SYSDATE(), SLEEP(3), SYSDATE();

実行結果(例)

NOW()        | SLEEP(3) | NOW()
2025-02-14 15:30:45 | 3秒待機 | 2025-02-14 15:30:45
SYSDATE()    | SLEEP(3) | SYSDATE()
2025-02-14 15:30:45 | 3秒待機 | 2025-02-14 15:30:48

🚨 トランザクションを扱う場合は NOW() の方が一貫性があるため推奨!

3.5 NOW()関数の制約と注意点

① タイムゾーンに依存

SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');

② テーブルのデフォルト値としては CURRENT_TIMESTAMP を使う

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

3.6 NOW()関数のまとめ

  • NOW() はMySQLで現在の日時を取得する最も一般的な関数。
  • データの挿入・更新・取得など、さまざまな用途で使用可能。
  • トランザクション内で統一した時刻を扱いたい場合は NOW() を使用。
  • SYSDATE() は実行ごとに異なる時刻を取得するため、正確な実行時刻が必要な場合に使用。
  • 異なるタイムゾーンの時刻を取得するには CONVERT_TZ() を使用。

📌 結論: MySQLで現在の日時を取得するなら、通常は NOW() を使うのがベスト!

4. SYSDATE()関数の特徴

SYSDATE() 関数は、MySQLで現在の日時を取得する方法の一つですが、NOW() とは異なる動作をします。
このセクションでは、SYSDATE() の基本的な使い方や NOW() との違い、注意点について詳しく解説します。

4.1 SYSDATE()関数とは?

SYSDATE() は、クエリの実行時の時刻を返す関数です。
NOW() とは異なり、実行のたびに異なる時刻を取得する特徴があります。

SYSDATE() の構文

SELECT SYSDATE();

実行結果(例)

2025-02-14 16:00:45
  • YYYY-MM-DD HH:MM:SS のフォーマットで返される
  • クエリが実行された瞬間の時刻が取得される

4.2 SYSDATE() と NOW() の違い

関数名取得のタイミング特徴
NOW()クエリ開始時クエリ実行時点の固定時刻を返す
SYSDATE()クエリ実行時毎回異なる時刻を返す

NOW() と SYSDATE() の動作比較

SELECT NOW(), SLEEP(3), NOW();
SELECT SYSDATE(), SLEEP(3), SYSDATE();

実行結果(例)

NOW()        | SLEEP(3) | NOW()
2025-02-14 16:00:45 | 3秒待機 | 2025-02-14 16:00:45
SYSDATE()    | SLEEP(3) | SYSDATE()
2025-02-14 16:00:45 | 3秒待機 | 2025-02-14 16:00:48

📌 ポイント

  • NOW()クエリ開始時の時刻を維持 するため、時間は変わらない。
  • SYSDATE()実行されるごとに異なる時刻を返す ため、3秒後に異なる時刻が表示される。

🚨 トランザクション処理では NOW() を使うべき

  • SYSDATE()マルチスレッド環境NOW()とは異なる動作 をするため、トランザクション処理では一貫性のある NOW() を使うのが推奨されます。

4.3 SYSDATE() の使用例

① データ挿入時に現在時刻を記録

INSERT INTO logs (event, created_at) VALUES ('ユーザーログイン', SYSDATE());

② データ更新時に現在時刻を記録

UPDATE users SET last_login = SYSDATE() WHERE id = 1;

③ 現在時刻を特定のフォーマットで取得

SELECT DATE_FORMAT(SYSDATE(), '%Y-%m-%d %H:%i:%s') AS formatted_time;

実行結果(例)

2025-02-14 16:05:30

4.4 SYSDATE() の制約と注意点

① トランザクションの影響

  • NOW()クエリ開始時点の時刻を保持するため、トランザクション内で一貫した時刻を利用できる。
  • SYSDATE()実行のたびに異なる時刻を取得するため、トランザクション内で時間のズレが発生する可能性がある。

② デフォルト値としては使用不可

  • SYSDATE()テーブルの DEFAULT 値として設定できない

解決策: DEFAULT CURRENT_TIMESTAMP を使用する。

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

4.5 どのような場合に SYSDATE() を使うべきか?

使用シーン推奨関数
通常の現在時刻取得NOW()
トランザクションで統一した時刻を使用NOW()
正確な実行時刻を取得したい場合SYSDATE()

🚀 SYSDATE() はリアルタイムログ記録などに適しているが、トランザクション処理には不向き。

4.6 SYSDATE() のまとめ

  • SYSDATE() は NOW() とは異なり、クエリの実行時点の時刻を取得できる関数。
  • 実行のたびに異なる時刻を返すため、リアルタイムのログ記録などに適している。
  • トランザクション内での一貫性を考慮する場合は NOW() を推奨。
  • デフォルト値としては CURRENT_TIMESTAMP を使用する必要がある。

📌 結論: 一般的な時刻取得には NOW() を使うのがベストだが、正確な実行時刻が必要なら SYSDATE() を選択!

5. CURTIME()関数とCURRENT_TIME()関数

MySQLで現在時刻を取得する際、CURTIME()CURRENT_TIME() は、時刻(HH:MM:SS)だけを取得したい場合に使用されます。
このセクションでは、それぞれの基本的な使い方や違い、実用例について詳しく解説します。

5.1 CURTIME()関数とは?

CURTIME() は、MySQLで 現在の時刻(時・分・秒)を取得する関数 です。
日付部分は含まれず、時間情報のみが返されるのが特徴です。

CURTIME() の構文

SELECT CURTIME();

実行結果(例)

16:30:45
  • フォーマットは HH:MM:SS
  • サーバーのタイムゾーン設定に基づく
  • NOW() とは異なり、日付情報が不要な場合に適している

5.2 CURRENT_TIME()関数とは?

CURRENT_TIME()CURTIME() と同じく、現在の時刻(HH:MM:SS)を取得する関数 です。
実際には CURTIME() と全く同じ動作をします。

CURRENT_TIME() の構文

SELECT CURRENT_TIME();

実行結果(例)

16:30:45

📌 違いは?

  • CURTIME() は MySQL独自の関数
  • CURRENT_TIME() は SQL標準の関数
  • どちらを使っても動作は同じ
  • 可読性の好みで選んでOK(どちらを使っても実行速度に差はない)

5.3 CURTIME()とCURRENT_TIME()の比較

関数名取得できる情報フォーマット特徴
CURTIME()現在の時刻(時・分・秒)HH:MM:SSMySQL独自の関数
CURRENT_TIME()現在の時刻(時・分・秒)HH:MM:SSSQL標準の関数

5.4 CURTIME() / CURRENT_TIME() の実用例

① データ挿入時に現在の時刻を記録

INSERT INTO user_logs (event, event_time) VALUES ('ログイン', CURTIME());

② フィルタリング(特定の時間帯のデータを取得)

SELECT * FROM logs WHERE TIME(created_at) BETWEEN '09:00:00' AND '18:00:00';

③ フォーマット変更(ミリ秒を含める)

SELECT CURTIME(3);  -- 小数点3桁まで表示

実行結果(例)

16:30:45.123

5.5 CURTIME() / CURRENT_TIME() の制約と注意点

① 日付情報がないため、日付と組み合わせる必要がある

SELECT CONCAT(CURDATE(), ' ', CURTIME()) AS full_datetime;

② デフォルト値として使用する場合

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_time TIME DEFAULT CURTIME()
);

5.6 どのような場合に CURTIME() / CURRENT_TIME() を使うべきか?

使用シーン推奨関数
現在の時刻のみ(時・分・秒)が必要CURTIME() または CURRENT_TIME()
日付も含めた現在時刻を取得NOW()
ミリ秒単位の時刻を取得CURTIME(3)

📌 基本的には、CURTIME()CURRENT_TIME() のどちらを使っても問題なし!
可読性の好みで選ぶとよいでしょう。

5.7 CURTIME() / CURRENT_TIME() のまとめ

  • CURTIME() は MySQL独自の関数、CURRENT_TIME() は SQL標準の関数
  • どちらも現在の時刻(HH:MM:SS)を取得する
  • フォーマット変更には CURTIME(3)DATE_FORMAT() を使用
  • 日付が必要なら CURDATE()NOW() を組み合わせる
  • デフォルト値としては CURRENT_TIMESTAMP を使用するのが一般的

📌 結論: 現在の「時刻のみ」が欲しいなら CURTIME() を使えばOK!

6. 現在時刻を使用した実用的なクエリ例

MySQLで現在時刻を取得する方法を理解したところで、実際の活用方法について見ていきましょう。
このセクションでは、現在時刻を使った実用的なクエリの例を紹介します。
データの挿入、更新、検索など、日常的なデータベース操作で役立つテクニックを解説します。

6.1 データ挿入時に現在時刻を記録

① ユーザー登録時に現在時刻を記録

INSERT INTO users (name, email, created_at) 
VALUES ('佐藤', 'sato@example.com', NOW());

6.2 データ更新時に現在時刻を記録

② ユーザーの最終ログイン日時を記録

UPDATE users SET last_login = NOW() WHERE id = 1;

6.3 過去◯日間のデータを取得

③ 過去7日間の注文データを取得

SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY;

6.4 指定した時間帯のデータを取得

④ 今日の午前9時〜午後6時に作成されたデータを取得

SELECT * FROM logs WHERE TIME(created_at) BETWEEN '09:00:00' AND '18:00:00';

6.5 タイムゾーンを考慮した現在時刻の取得

⑤ UTC時刻を日本時間(JST)に変換

SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');

6.6 レコードの作成日時をデフォルトで現在時刻にする

⑥ created_at に現在時刻を自動設定

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

6.7 一定時間経過後のデータを削除

⑦ 30日以上前のデータを削除

DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;

6.8 現在時刻をミリ秒(マイクロ秒)まで取得

⑧ ミリ秒単位の現在時刻を取得

SELECT NOW(3);

実行結果

2025-02-14 16:30:45.123

6.9 現在時刻を使ったユースケース別の選択ガイド

使用シーン推奨関数
データ挿入時に現在時刻を記録NOW()INSERT INTO users (name, created_at) VALUES ('佐藤', NOW());
データ更新時に現在時刻を記録NOW()UPDATE users SET last_login = NOW() WHERE id = 1;
過去◯日間のデータを取得NOW() - INTERVAL X DAYSELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY;
特定の時間帯のデータを取得CURTIME()SELECT * FROM logs WHERE TIME(created_at) BETWEEN '09:00:00' AND '18:00:00';
UTC時刻をJSTに変換CONVERT_TZ()SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
古いデータを削除(30日以上前)NOW() - INTERVAL X DAYDELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;

6.10 まとめ

  • NOW() を使えば基本的な現在時刻の取得が可能
  • CURTIME()CURRENT_TIME() は時間のみを取得したい場合に有効
  • 過去◯日間のデータ取得、時間帯フィルタ、ミリ秒精度の取得など、多様な用途に活用できる
  • タイムゾーンの影響を受けるため、CONVERT_TZ() を使用して適切な時間を取得する
  • データベースのサイズ管理のために、古いデータを自動削除する仕組みも重要

📌 結論: 現在時刻を活用することで、MySQLでのデータ管理をより効率的に!

7. FAQ(よくある質問)

MySQLで現在時刻を取得する方法について、よくある質問(FAQ) をまとめました。
それぞれの疑問に対して、分かりやすく解説します。

7.1 NOW()関数とSYSDATE()関数の違いは何ですか?

答え

NOW()SYSDATE() はどちらも現在の日時を取得しますが、取得タイミング に違いがあります。

関数名取得タイミング特徴
NOW()クエリ開始時クエリ実行時点の固定時刻を取得
SYSDATE()クエリ実行時実行するたびに異なる時刻を取得

動作確認

SELECT NOW(), SLEEP(3), NOW();
SELECT SYSDATE(), SLEEP(3), SYSDATE();

実行結果(例)

NOW()        | SLEEP(3) | NOW()
2025-02-14 16:30:45 | 3秒待機 | 2025-02-14 16:30:45
SYSDATE()    | SLEEP(3) | SYSDATE()
2025-02-14 16:30:45 | 3秒待機 | 2025-02-14 16:30:48

🚨 トランザクション処理では NOW() を使うのが推奨!

7.2 CURRENT_TIMESTAMP()とNOW()は同じですか?

答え

基本的には 同じ動作 をしますが、CURRENT_TIMESTAMP()デフォルト値として使用可能 です。

テーブル作成時の例

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

7.3 現在時刻を特定のタイムゾーンで取得する方法は?

答え

SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');

7.4 現在時刻を自動的に記録するには?

答え

テーブル作成時に DEFAULT CURRENT_TIMESTAMP を指定すれば、自動的に created_at に現在時刻が保存されます。

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

7.5 過去◯日間のデータを取得する方法は?

答え

SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY;

7.6 現在時刻をミリ秒(マイクロ秒)まで取得するには?

答え

SELECT NOW(3);

実行結果

2025-02-14 16:30:45.123

7.7 まとめ

  • NOW()SYSDATE() は取得タイミングが異なる
  • CURRENT_TIMESTAMP()DEFAULT 値として使用できる
  • CONVERT_TZ() を使えば、異なるタイムゾーンの時刻を取得可能
  • 自動的に現在時刻を記録する場合は DEFAULT CURRENT_TIMESTAMP を活用
  • 過去◯日間のデータ取得には NOW() - INTERVAL X DAY を使用
  • NOW(3)NOW(6) でミリ秒・マイクロ秒精度の時刻取得が可能

📌 結論: MySQLで現在時刻を扱うには、適切な関数を選ぶことが重要!

8. まとめ

本記事では、MySQLで現在時刻を取得する方法について詳しく解説しました。
NOW()関数を中心に、類似する関数の違いや実際のクエリ例、注意点などを紹介しました。

8.1 MySQLで現在時刻を取得する主な関数

関数名取得できる情報フォーマット特徴
NOW()現在の日時YYYY-MM-DD HH:MM:SS最も一般的な関数
SYSDATE()実行時の日時YYYY-MM-DD HH:MM:SSクエリ実行ごとに異なる時間を取得
CURTIME()現在の時刻HH:MM:SS日付なし、時刻のみ取得
CURRENT_TIME()現在の時刻HH:MM:SSCURTIME()と同じ
CURRENT_TIMESTAMP()現在の日時YYYY-MM-DD HH:MM:SSNOW()とほぼ同じ
UTC_TIMESTAMP()UTCの現在日時YYYY-MM-DD HH:MM:SSタイムゾーンがUTC固定

📌 結論:

  • 一般的な現在時刻の取得には NOW() を使うのがベスト
  • 実行時点の正確な時刻が必要な場合は SYSDATE() を使用
  • 日付なしの時刻のみが必要な場合は CURTIME() を選択

8.2 現在時刻を活用する実用的なクエリ

データ挿入時に現在時刻を記録

INSERT INTO users (name, created_at) VALUES ('佐藤', NOW());

データ更新時に現在時刻を記録

UPDATE users SET last_login = NOW() WHERE id = 1;

過去7日間のデータを取得

SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY;

タイムゾーンを考慮して時刻を取得

SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');

古いデータ(30日以上前)を削除

DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;

8.3 タイムゾーンに関する注意点

  • MySQLの NOW()デフォルトのタイムゾーン設定に基づく ため、異なる環境で異なる結果になる可能性がある。
  • 異なるタイムゾーンの時刻を取得するには CONVERT_TZ() を使用
  • サーバーのタイムゾーンを変更する場合
SET GLOBAL time_zone = 'Asia/Tokyo';

8.4 MySQLで現在時刻を取得する際のFAQ

Q1. NOW()SYSDATE() の違いは?

NOW()クエリ開始時の時刻を取得SYSDATE()クエリ実行時の時刻を取得

Q2. CURRENT_TIMESTAMP()NOW() は同じ?

ほぼ同じ だが、CURRENT_TIMESTAMP()デフォルト値として使用可能

Q3. 現在時刻をミリ秒(マイクロ秒)まで取得するには?

NOW(3)(ミリ秒単位)、NOW(6)(マイクロ秒単位)を使う。

SELECT NOW(3); -- 例: 2025-02-14 16:30:45.123

8.5 まとめ

  • MySQLで現在時刻を取得するには、用途に応じて適切な関数を選ぶことが重要
  • 通常の時刻取得には NOW()、正確な実行時刻が必要なら SYSDATE() を使う
  • 日付なしの時刻が必要なら CURTIME()、異なるタイムゾーンの時刻が必要なら CONVERT_TZ() を利用する
  • データの登録・更新・検索・削除など、さまざまな場面で現在時刻を活用できる

📌 結論: MySQLの時刻関数を適切に使いこなすことで、より効率的なデータ管理が可能になる!