【完党ガむド】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_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_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_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 の䜿甚
DATETIME1000-01-01 00:00:00  9999-12-31 23:59:598バむトなし明瀺的に蚭定可胜
TIMESTAMP1970-01-01 00:00:01 UTC  2038-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_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_TIMESTAMPTIMESTAMPTIMESTAMP 型のカラムのデフォルト倀に䜿甚できる

特に CURRENT_TIMESTAMP は TIMESTAMP 型のカラムに自動的に適甚できるため、テヌブル蚭蚈時に圹立぀ 堎面が倚いです。

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() を掻甚すれば 時刻を芋やすい圢匏に倉換 できる
✅ INTERVAL や DATEDIFF() を䜿うず 日付・時間の蚈算 が可胜
✅ TIMESTAMP 型を䜿えば 䜜成日時・曎新日時を自動蚘録 できる
✅ タむムゟヌンの管理を適切に行うこずで 異なる地域の時刻を正しく扱える

MySQLで珟圚時刻を適切に扱うこずは、ログ管理・デヌタ集蚈・トランザクション凊理 など、あらゆる堎面で重芁です。本蚘事で孊んだ内容を掻甚し、より効率的なデヌタベヌス運甚を実珟しおください