Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

EXTRACT / FORMAT

日付・日時から年・月・日などの要素を取り出したり、指定した書式の文字列に整形したりする関数です。

構文
-- 日付から指定した要素を取り出します(標準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で日付を任意の書式の文字列に変換します。
サンプルコード
-- 注文日から年と月を取り出します。
SELECT order_id,
       EXTRACT(YEAR FROM order_date)  AS order_year,
       EXTRACT(MONTH FROM order_date) AS order_month
FROM orders;

-- 月ごとの注文件数を集計します。
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;

-- 日付を「2025年10月15日」形式に整形します(MySQL)。
SELECT DATE_FORMAT(order_date, '%Y年%m月%d日') AS formatted_date
FROM orders;

-- 日付を「2025/10/15」形式に整形します(PostgreSQL)。
SELECT TO_CHAR(order_date, 'YYYY/MM/DD') AS formatted_date
FROM orders;
実行結果
-- 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 |
-- +----------+------------+-------------+

-- SELECT DATE_FORMAT(order_date, '%Y年%m月%d日') AS formatted_date FROM orders; の結果例
-- +------------------+
-- | formatted_date   |
-- +------------------+
-- | 2025年08月01日   |
-- | 2025年10月05日   |
-- | 2025年10月15日   |
-- +------------------+
データベース別の書き方

『EXTRACT』は標準SQLであり、MySQL・PostgreSQL で共通して使用できます。

SELECT EXTRACT(YEAR FROM order_date) AS order_year,
       EXTRACT(MONTH FROM order_date) AS order_month
FROM orders;

日付のフォーマット関数はデータベースごとに異なります。PostgreSQL では『TO_CHAR』を使用します。

-- 日付を「2025/10/15」形式に整形します(PostgreSQL)。
SELECT TO_CHAR(order_date, 'YYYY/MM/DD') AS formatted_date FROM orders;

Oracle でも『EXTRACT』と『TO_CHAR』が使用できます。書式指定子はPostgreSQLと同じです。

-- 年と月を取り出します(Oracle)。
SELECT EXTRACT(YEAR FROM order_date) AS order_year FROM orders;

-- 日付をフォーマットします(Oracle)。
SELECT TO_CHAR(order_date, 'YYYY"年"MM"月"DD"日"') AS formatted_date FROM orders;

SQL Server では『YEAR()』『MONTH()』『DAY()』関数、またはフォーマットには『FORMAT』関数を使用します。

-- 年と月を取り出します(SQL Server)。
SELECT YEAR(order_date) AS order_year, MONTH(order_date) AS order_month FROM orders;

-- 日付をフォーマットします(SQL Server 2012以降)。
SELECT FORMAT(order_date, 'yyyy/MM/dd') AS formatted_date FROM orders;

SQLite では『strftime』関数を使用します。

-- 年と月を取り出します(SQLite)。
SELECT strftime('%Y', order_date) AS order_year,
       strftime('%m', order_date) AS order_month
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』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。