18.【MySQL】日付および時間の関数

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の時刻も自動的に更新されているのがわかります。

このエントリーをはてなブックマークに追加

コメントを残す

頂いたコメントは一読した後表示させて頂いております。
反映まで数日かかる場合もございますがご了承下さい。