Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

MySQLなどデータベースを扱う上で日付を指定しデータを取得することは度々あります。

MySQLではDATEなどの時間型をより簡単に扱うためにDATE_FORMATやTIME_FORMATというものが用意されています。

今回はこの中で「DATE_FORMAT」について解説していきたいと思います。

フォーマット形式

DATE_FORMATで使うフォーマット形式には様々なものがあり、これを指定子と呼びます。

指定子を以下に簡単にまとめてみました。

フォーマット形式
  • %a – 簡略曜日名 (Sun..Sat)
  • %b – 簡略月名 (Jan..Dec)
  • %c – 月、数字 (0..12)
  • %D – 英語のサフィクスを持つ日付 (0th, 1st, 2nd, 3rd, …)
  • %d – 日、数字 (00..31)
  • %e – 日、数字 (0..31)
  • %f – マイクロ秒 (000000..999999)
  • %H – 時間 (00..23)
  • %h – 時間 (01..12)
  • %I – 時間 (01..12)
  • %i – 分、数字 (00..59)
  • %j – 年間通算日 (001..366)
  • %k – 時 (0..23)
  • %l – 時 (1..12)
  • %M – 月名 (January..December)
  • %m – 月、数字 (00..12)
  • %p – AM または PM
  • %r – 時間、12時間単位 (hh:mm:ss に AM または PM が続く)
  • %S – 秒 (00..59)
  • %s – 秒 (00..59)
  • %T – 時間、24 時間単位 (hh:mm:ss)
  • %U – 週 (00..53)、日曜日が週の初日、WEEK() モード 0
  • %u – 週 (00..53)、月曜日が週の初日、WEEK() モード 1
  • %V – 週 (01..53)、日曜日が週の初日、WEEK() モード 2、%X とともに使用
  • %v – 週 (01..53)、月曜日が週の初日、WEEK() モード 3、%x とともに使用
  • %W – 曜日名 (Sunday..Saturday)
  • %w – 曜日 (0=Sunday..6=Saturday)
  • %X – 年間の週、日曜日が週の初日、数字、4桁、%V とともに使用
  • %x – 年間の週、月曜日が週の初日、数字、4桁、%v とともに使用
  • %Y – 年、数字、4桁
  • %y – 年、数字 (2桁)
  • %% – リテラル 「%」 文字

DATE_FORMATの使い方

それでは具体的な使い方について見ていきましょう。

DATE_FORMATの基本構文は以下の通りです。

DATE_FORMAT(date,format)

実際のコードでフォーマットをそれぞれ確認してみましょう。

// 簡略曜日名
SELECT DATE_FORMAT('2019-12-30', '%a');
+--------------------------+
| DATE_FORMAT(now(), '%a') |
+--------------------------+
| Mon                      |
+--------------------------+

// 年間通算日
SELECT DATE_FORMAT('2019-12-30', '%j');
+--------------------------+
| DATE_FORMAT(now(), '%j') |
+--------------------------+
| 364                      |
+--------------------------+

// 現在日時時間から現在時刻だけを抽出
SELECT DATE_FORMAT(now(), '%H:%i:%s');
+--------------------------------+
| DATE_FORMAT(now(), '%H:%i:%s') |
+--------------------------------+
| 05:01:12                       |
+--------------------------------+

// 2018年1月1日は月曜日のため、フォーマット次第では以下のようにズレが生じる
SELECT DATE_FORMAT('2018-01-01', '%X %V');
+------------------------------------+
| DATE_FORMAT('2018-01-01', '%X %V') |
+------------------------------------+
| 2017 53                            |
+------------------------------------+

// カラムを区切って表示させるには以下のように記述する
SELECT DATE_FORMAT(now(), '%Y年%m月%d日') AS '年月日',
    -> DATE_FORMAT(now(), '%T') AS '現在時刻(24時間)';
+----------------+------------------+
| 年月日              | 現在時刻(24時間)            |
+----------------+------------------+
| 2019年12月30日      | 05:13:46         |
+----------------+------------------+

DATE_FORMATの応用

DATE_FORMATを使って年間カレンダーを作る方法をご紹介します。

CREATE TABLE calendar_table(
    id INT(11) AUTO_INCREMENT NOT NULL PRIMARY KEY,
    date DATE,
    day_of_week VARCHAR(20)
);
Query OK, 0 rows affected (0.024 sec)

SHOW COLUMNS FROM calendar_table;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int(11)     | NO   | PRI | NULL    | auto_increment |
| date        | date        | YES  |     | NULL    |                |
| day_of_week | varchar(20) | YES  |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
3 rows in set (0.018 sec)

INSERT INTO calendar_table
	(date, day_of_week)
VALUES(
	@f := DATE_FORMAT(CURDATE(), '2019-01-01'),
	@W := DATE_FORMAT(@f, '%W')
)
UNION ALL
SELECT
	@f := DATE_FORMAT(DATE_ADD(@f, INTERVAL 1 DAY), '%Y-%m-%d'),
	@w := DATE_FORMAT(@f, '%W')
FROM
	information_schema.COLUMNS
WHERE
	@f < LAST_DAY(DATE_FORMAT(CURDATE(), '2019-12-01'))
;
Query OK, 365 rows affected (0.098 sec)
Records: 365  Duplicates: 0  Warnings: 0

INSERT INTOで予め用意しておいたテーブルに基点となるデータを追加し、WHERE句を使ってループ処理させています。

UNION ALLを使用することによって、”INSERT INTO”とその次のクエリである”SELECT”を結合させることが出来るようになります。

この時、基点は”INSERT INTO”となっているため、SELECT + WHEREでループする数だけINSERTする仕組みとなります。

まとめ

いかがでしたか?

今回はDATE_FORMATについて解説してきましたが、意外にも使い方に幅があることがお判りいただけたと思います。

データベースの設計をする場合にはMySQL内で全てのクエリを実行させるため、基本を確実に覚えるようにしましょう。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。