EXTRACT / FORMAT
| 対応: | SQL-92(1992) |
|---|
日付・日時から年・月・日などの要素を取り出したり、指定した書式の文字列に整形したりする関数です。
構文
日付から指定した要素を取り出します(標準SQL)。
SELECT EXTRACT(フィールド FROM 日付);
日付を指定した書式の文字列に変換します(MySQL)。
SELECT DATE_FORMAT(日付, '書式文字列');
日付を指定した書式の文字列に変換します(PostgreSQL)。
SELECT TO_CHAR(日付, '書式文字列');
構文一覧
| 構文 | 概要 |
|---|---|
| EXTRACT(YEAR FROM 日付) | 日付から年を整数で取り出します。 |
| EXTRACT(MONTH FROM 日付) | 日付から月(1〜12)を整数で取り出します。 |
| EXTRACT(DAY FROM 日付) | 日付から日(1〜31)を整数で取り出します。 |
| EXTRACT(HOUR FROM 日時) | 日時から時(0〜23)を整数で取り出します。 |
| DATE_FORMAT(日付, 書式) | MySQLで日付を任意の書式の文字列に変換します。 |
| TO_CHAR(日付, 書式) | PostgreSQLで日付を任意の書式の文字列に変換します。 |
サンプルコード
以下の『orders』テーブルを例に説明します。
注文日から年と月を取り出します。
sample_extract_format.sql
SELECT order_id,
EXTRACT(YEAR FROM order_date) AS order_year,
EXTRACT(MONTH FROM order_date) AS order_month
FROM orders;
+----------+------------+-------------+ | order_id | order_year | order_month | +----------+------------+-------------+ | 1 | 2025 | 8 | | 2 | 2025 | 10 | | 3 | 2025 | 10 | +----------+------------+-------------+ 3 rows in set
月ごとの注文件数を集計します。
※ SELECT の別名(year・month)を GROUP BY で使用できるのは MySQL の拡張機能です。PostgreSQL では『GROUP BY EXTRACT(YEAR FROM order_date), EXTRACT(MONTH FROM order_date)』と記述する必要があります。
sample_extract_format.sql
SELECT EXTRACT(YEAR FROM order_date) AS year,
EXTRACT(MONTH FROM order_date) AS month,
COUNT(*) AS order_count
FROM orders
GROUP BY year, month
ORDER BY year, month;
+------+-------+-------------+ | year | month | order_count | +------+-------+-------------+ | 2025 | 8 | 1 | | 2025 | 10 | 2 | +------+-------+-------------+ 2 rows in set
日付を「2025年10月15日」形式に整形します(MySQL)。
sample_extract_format.sql
SELECT DATE_FORMAT(order_date, '%Y年%m月%d日') AS formatted_date FROM orders;
+----------------+ | formatted_date | +----------------+ | 2025年08月01日 | | 2025年10月05日 | | 2025年10月15日 | +----------------+ 3 rows in set
日付を「2025/10/15」形式に整形します(PostgreSQL)。
sample_extract_format.sql
SELECT TO_CHAR(order_date, 'YYYY/MM/DD') AS formatted_date FROM orders;
+----------------+ | formatted_date | +----------------+ | 2025/08/01 | | 2025/10/05 | | 2025/10/15 | +----------------+ 3 rows in set
データベース別の書き方
MySQL / MariaDB
『EXTRACT』と『DATE_FORMAT』が使用できます。
SELECT EXTRACT(YEAR FROM order_date) AS order_year,
EXTRACT(MONTH FROM order_date) AS order_month
FROM orders;
SELECT DATE_FORMAT(order_date, '%Y年%m月%d日') AS formatted_date FROM orders;
PostgreSQL
『EXTRACT』と『TO_CHAR』が使用できます。日付のフォーマット指定子はMySQLとは異なります。
SELECT EXTRACT(YEAR FROM order_date) AS order_year,
EXTRACT(MONTH FROM order_date) AS order_month
FROM orders;
SELECT TO_CHAR(order_date, 'YYYY/MM/DD') AS formatted_date FROM orders;
SQLite
SQLite では『strftime』関数を使用します。『EXTRACT』は使用できません。
SELECT strftime('%Y', order_date) AS order_year,
strftime('%m', order_date) AS order_month
FROM orders;
SELECT strftime('%Y/%m/%d', order_date) AS formatted_date FROM orders;
概要
『EXTRACT』は標準SQLで定義されており、MySQLでもPostgreSQLでも動作します。取得できるフィールドにはYEAR・MONTH・DAY・HOUR・MINUTE・SECOND・DOW(曜日)・WEEK(週番号)などがあります。
MySQLの『DATE_FORMAT』で使用できる主な書式指定子には、『%Y』(4桁の年)・『%m』(2桁の月)・『%d』(2桁の日)・『%H』(24時間制の時)・『%i』(分)・『%s』(秒)などがあります。PostgreSQLの『TO_CHAR』では『YYYY』『MM』『DD』『HH24』『MI』『SS』を使います。
現在の日付・日時を取得するには『CURRENT_DATE / NOW』を、日付の加減算には『DATE_ADD / DATEDIFF』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。