MySQLには日時に対して使える関数がいくつか用意されています。この記事ではその中でも特に基本的なものを例に、関数を使った日時の処理について学びましょう。
目次
年・月・日を抜き出す
日時データから年・月・日を抜き出したい場合はそれぞれ次の関数を使います。
YEAR() -- 年 MONTH() -- 月 DAY() -- 日
実際に例を見てみましょう。
-- titlesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS titles; -- titlesという名前のテーブルを作成 CREATE TABLE titles ( id INT NOT NULL AUTO_INCREMENT, author_id INT, post_title VARCHAR(50) UNIQUE, view INT, created DATETIME, PRIMARY KEY (id) ); -- レコードを挿入 INSERT INTO titles (author_id, post_title, view, created) VALUES (1, 'MySQLとは', 80, '2022-10-19'), (2, 'SQLとはなにか', 50, '2022-10-22'), (1, 'DockerでMySQLを使う方法', 10, '2022-10-23'); -- createdカラムから年・月・日を抜き出す SELECT created, YEAR(created) FROM titles; -- 年 SELECT created, MONTH(created) FROM titles; -- 月 SELECT created, DAY(created) FROM titles; -- 日
実行結果は次のとおりです。
created YEAR(created) 2022-10-19 00:00:00 2022 2022-10-22 00:00:00 2022 2022-10-23 00:00:00 2022 created MONTH(created) 2022-10-19 00:00:00 10 2022-10-22 00:00:00 10 2022-10-23 00:00:00 10 created DAY(created) 2022-10-19 00:00:00 19 2022-10-22 00:00:00 22 2022-10-23 00:00:00 23
日時データを格納したcreatedカラムからそれぞれ年・月・日を抜き出して取得できているのがわかります。
日時のフォーマットを変更
日時のフォーマットを変更して抽出したい場合はDATE_FORMAT関数を使います。
DATE_FORMAT()
こちらも例を見てみましょう。
-- 日時データを抽出してフォーマットを変更して取得 SELECT created, DATE_FORMAT(created, '%M %D %Y') FROM titles;
createdカラムに格納した日時を英語表記の月、日、年の順で並ぶフォーマットに変更します。
実行結果は次のとおりです。
2022-10-19 00:00:00 October 19th 2022 2022-10-22 00:00:00 October 22nd 2022 2022-10-23 00:00:00 October 23rd 2022
このように別のフォーマットへの変更ができました。
現在時刻を取得
現在時刻を取得するにはNOW関数を使います。
NOW()
実際に3番目のレコードのcreatedカラムの値を現在時刻にしてみましょう。
-- レコードを挿入 INSERT INTO titles (author_id, post_title, view, created) VALUES (1, 'MySQLとは', 80, '2022-10-19'), (2, 'SQLとはなにか', 50, '2022-10-22'), (1, 'DockerでMySQLを使う方法', 10, NOW()); -- 現在時刻に -- すべてのレコードを取得 SELECT * FROM titles;
実行結果は次のとおりです。
id author_id post_title view created 1 1 MySQLとは 80 2022-10-19 00:00:00 2 2 SQLとはなにか 50 2022-10-22 00:00:00 3 1 DockerでMySQLを使う方法 10 2022-10-23 09:25:08
3番目のレコードのcreatedカラムの値を現在時刻(レコードを挿入した時刻)になっています。
日付を用いた計算
日付を元に計算を行うことも可能です。
例えば次のような関数が用意されています。
DATE_ADD() -- 日付値に時間値 (間隔) を加算 DATEDIFF() -- 2 つの日付の差
こちらも実際に使ってみましょう。
-- createdに7日を足して取得 SELECT created, DATE_ADD(created, INTERVAL 7 DAY) FROM titles; -- createdと現在時刻の差を取得 SELECT created, DATEDIFF(created, NOW()) FROM titles;
実行結果は次のとおりです。
created DATE_ADD(created, INTERVAL 7 DAY) 2022-10-19 00:00:00 2022-10-26 00:00:00 2022-10-22 00:00:00 2022-10-29 00:00:00 2022-10-23 09:34:10 2022-10-30 09:34:10 created DATEDIFF(created, NOW()) 2022-10-19 00:00:00 -4 2022-10-22 00:00:00 -1 2022-10-23 09:34:10 0
作成・更新日時の自動設定
NOW関数を使えばレコードを作成した時や更新した時に、日時を自動的に作成・更新することができます。
テーブルの作成時に次のように記述します。
CREATE TABLE テーブル名 ( カラム名 DATETIME DEFAULT NOW(), -- 作成時の日時を自動的に格納 カラム名 DATETIME ON UPDATE NOW(), -- 更新時の日時を自動的に格納 );
実際の例を見てみましょう。
-- titlesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS titles; -- titlesという名前のテーブルを作成 CREATE TABLE titles ( id INT NOT NULL AUTO_INCREMENT, author_id INT, post_title VARCHAR(50) UNIQUE, view INT, created DATETIME DEFAULT NOW(), -- 作成時の日時を自動的に格納 updated DATETIME DEFAULT NOW() ON UPDATE NOW(), -- 更新時の日時を自動的に格納 PRIMARY KEY (id) ); -- レコードを挿入 INSERT INTO titles (author_id, post_title, view) VALUES (1, 'MySQLとは', 80), (2, 'SQLとはなにか', 50), (1, 'DockerでMySQLを使う方法', 10); -- 現在時刻に SELECT * FROM titles; -- レコードを取得 SELECT SLEEP(3); -- 3秒待機 UPDATE titles SET view = 30 WHERE id = 3; -- idが3のレコードのviewを30に更新 SELECT * FROM titles; -- レコードを取得
実行結果は次のとおりです。
id author_id post_title view created updated 1 1 MySQLとは 80 2022-10-23 10:53:36 2022-10-23 10:53:36 2 2 SQLとはなにか 50 2022-10-23 10:53:36 2022-10-23 10:53:36 3 1 DockerでMySQLを使う方法 10 2022-10-23 10:53:36 2022-10-23 10:53:36 SLEEP(3) 0 id author_id post_title view created updated 1 1 MySQLとは 80 2022-10-23 10:53:36 2022-10-23 10:53:36 2 2 SQLとはなにか 50 2022-10-23 10:53:36 2022-10-23 10:53:36 3 1 DockerでMySQLを使う方法 30 2022-10-23 10:53:36 2022-10-23 10:53:39
createdカラムとupdatedカラムにテーブル作成時の時刻が自動的に格納されています。
さらに3秒待機した後、idが3のレコードのviewを30に更新していますが、その際にupdatedの時刻も自動的に更新されているのがわかります。