MySQLのDATE_FORMAT関数の使い方!(日付を指定書式で整形)

MySQL

MySQLのDATE_FORMAT関数について書いています。

DATE_FORMAT関数は、日付や時刻の値を指定したフォーマットに従って文字列に変換するために使用されます。
この関数を使うことで、データベースに格納されている日付データを、Webサイトの表示形式やレポートの出力形式など、様々な要件に合わせて柔軟に整形することができます。

この記事ではDATE_FORMAT関数の基本的な使い方から、よく使うフォーマット指定子などを解説しています。

DATE_FORMAT関数の基本的な構文

DATE_FORMAT関数の基本的な構文は以下の通りです。

DATE_FORMAT(date, format)
  • date: 整形したい日付または日時型のカラムや値。
  • format: 日付や時刻をどのように整形するかを指定するフォーマット文字列。この文字列には、特定のパターンを表すフォーマット指定子が含まれます。

主要なフォーマット指定子一覧

DATE_FORMAT 関数でよく使用される主要なフォーマット指定子を以下にまとめました。

指定子 説明
%Y 4桁の年 (YYYY) 2023
%y 2桁の年 (YY) 23
%m 2桁の月 (01-12) 05
%c 月 (1-12) 5
%M 月のフルネーム (January-December) May
%b 月の省略名 (Jan-Dec) May
%d 2桁の日 (01-31) 08
%e 日 (1-31) 8
%H 24時間形式の時 (00-23) 14
%k 24時間形式の時 (0-23) 14
%h 12時間形式の時 (01-12) 02
%I 12時間形式の時 (01-12) 02
%l 12時間形式の時 (1-12) 2
%i 2桁の分 (00-59) 30
%s 2桁の秒 (00-59) 55
%S 2桁の秒 (00-59) 55
%p AM または PM PM
%W 週のフルネーム (Sunday-Saturday) Wednesday
%a 週の省略名 (Sun-Sat) Wed
%w 曜日 (0=Sunday, 1=Monday, …, 6=Saturday) 3
%j 年の通算日 (001-366) 128
%U 年の週番号 (日曜日を週の最初の日とする) (00-53) 18
%u 年の週番号 (月曜日を週の最初の日とする) (00-53) 19
%% リテラルの % %

注意: フォーマット文字列では、これらの指定子と、ハイフン (-)、スラッシュ (/)、コロン (:) などのリテラル文字を組み合わせて使用できます。

DATE_FORMAT関数の具体的な使用例

実際にDATE_FORMAT関数を使って日付を整形する例を見ていきましょう。

例1:基本的な日付形式 (YYYY-MM-DD)

SELECT DATE_FORMAT('2025-05-13', '%Y-%m-%d');
-- 結果:2025-05-13

例2:スラッシュ区切りの日付形式 (YYYY/MM/DD)

SELECT DATE_FORMAT('2025-05-13', '%Y/%m/%d');
-- 結果:2025/05/13

例3:月の名前を含む形式 (YYYY年M月D日)

SELECT DATE_FORMAT('2025-05-13', '%Y年%c月%e日');
-- 結果:2025年5月13日

例4:曜日を含む形式 (YYYY-MM-DD (曜日))

SELECT DATE_FORMAT('2025-05-13', '%Y-%m-%d (%a)');
-- 結果:2025-05-13 (Tue)

例5:時間を含む形式 (YYYY-MM-DD HH:MM:SS)

SELECT DATE_FORMAT('2025-05-13 15:45:30', '%Y-%m-%d %H:%i:%s');
-- 結果:2025-05-13 15:45:30

例6:12時間形式とAM/PM (YYYY-MM-DD hh:mm:ss AM/PM)

SELECT DATE_FORMAT('2025-05-13 15:45:30', '%Y-%m-%d %h:%i:%s %p');
-- 結果:2025-05-13 03:45:30 PM

例7:テーブルのカラムを整形する
ordersテーブルのorder_dateカラムをYYYY年MM月DD日形式で取得するといった場合です。
変換したいカラムを指定することで、カラムの内容が日付だった場合に整形された状態で取得できます。

SELECT order_id, DATE_FORMAT(order_date, '%Y年%m月%d日') AS formatted_date
FROM orders;

DATE_FORMAT関数を使う際の注意点

  • 大文字・小文字の区別: フォーマット指定子は大文字と小文字が区別されます。例えば、%M は月のフルネームですが、%m は2桁の月を表します。
  • リテラル文字のエスケープ: フォーマット文字列内で % 記号をリテラルとして使用したい場合は、%% と記述する必要があります。
  • 日付型のデータ:DATE_FORMAT関数の最初の引数は、有効な日付型または日時型のデータである必要があります。文字列型の場合は、MySQLが自動的に型変換を試みますが、意図しない結果になる可能性があるため、適切なデータ型を使用することが推奨されます。
  • パフォーマンス: 大量のデータに対してDATE_FORMAT関数を頻繁に使用すると、パフォーマンスに影響を与える可能性があります。特に複雑なフォーマットを使用する場合は注意が必要です。可能な限り、アプリケーション側で整形処理を行うことも検討しましょう。
  • ロケール:DATE_FORMAT関数の出力は、MySQLサーバーのロケール設定に依存する場合があります。特に月の名前や曜日の名前は、ロケールによって異なることがあります。

DATE_FORMAT関数で変換できなかったとき

与えられた値が日付や日時の形式として、解釈できない文字列や数値だった場合は、DATE_FORMAT関数では通常NULLが返ってきます。

  • データ型の重要性: 日付や時刻を扱うカラムは、適切なデータ型 (DATE, DATETIME, TIMESTAMP) で定義することが重要です。これにより、データの整合性が保たれDATE_FORMAT関数も期待通りに動作します。
  • 明示的な型変換: もし文字列型のカラムに日付のようなデータが入っている場合は、STR_TO_DATE関数などを使って明示的に日付型に変換してからDATE_FORMATを適用する方が安全で確実です。

まとめ

MySQLのDATE_FORMAT関数は、日付や時刻のデータを様々な形式で文字列に整形するための強力なツールです。

データベースに格納された日付データをユーザーフレンドリーな形式で表示したり、特定のレポート要件に合わせた出力を行ったりする際に、ぜひDATE_FORMAT関数を活用してください。
ただし、パフォーマンスやロケールの影響には注意し、状況に応じて適切な方法を選択することが重要です。

コメント