コマンド道場

$ man to-char

TO_CHAR

日付・時刻関数

日付や数値を、書式を指定して文字列に変える。帳票や画面に出す形を作るときに使う。

呼び出しの形

TO_CHAR(日付, 'YYYY/MM/DD')
TO_CHAR(数値, '999,999')
TO_CHAR(数値, 'FM999,999')

つまずきやすいところ

  • MM は月、MI は分です。 取り違えてもエラーにならず、違う数字が黙って入ります。

  • 数値の書式は先頭に空白が入ります(符号のぶん)。桁をそろえたいとき以外は FM を付けてください。

  • DayMonth は決まった幅まで空白で埋められます。FMDay にすると埋めません。

  • 並べ替えや比較は日付のまま行ってください。TO_CHAR の結果は文字列なので、比べると文字の並び順になります。

  • 引数が NULL なら結果も NULL です。表示用の既定値を入れたいなら COALESCE で包んでください。

実行例

結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。

日付を決まった形の文字列にする
SELECT juchu_id, juchu_on, TO_CHAR(juchu_on, 'YYYY/MM/DD') AS surasshu, TO_CHAR(juchu_on, 'YYYY-MM') AS nengetsu FROM juchu ORDER BY juchu_id
juchu_idjuchu_onsurasshunengetsu
10012025-11-052025/11/052025-11
10022025-11-182025/11/182025-11
10032025-12-022025/12/022025-12
10042025-12-092025/12/092025-12
10052025-12-242025/12/242025-12
10062026-01-072026/01/072026-01
10072026-01-212026/01/212026-01
10082026-02-032026/02/032026-02

10(うち 8 行を表示)

年月だけに削ると、月ごとに集計するときのキーとして使えます。

MM と MI を取り違えても、エラーにならない
SELECT TO_CHAR(DATE '2026-02-03', 'YYYY-MM-DD') AS tsuki, TO_CHAR(TIMESTAMP '2026-02-03 04:05:06', 'YYYY-MI-DD') AS fun
tsukifun
2026-02-032026-05-03

1

2 つ目は月の位置に分の 05 が入っています。エラーも警告も出ません。

数値の桁区切りと、先頭に入る空白
SELECT shohin_name, REPLACE(TO_CHAR(price, '999,999'), ' ', '_') AS kugiri, LENGTH(TO_CHAR(price, '999,999')) AS mojisu, TO_CHAR(price, 'FM999,999') AS fm FROM shohin ORDER BY shohin_id
shohin_namekugirimojisufm
ノート_____1808180
ボールペン_____1208120
付箋_____2508250
デスクチェア__24,800824,800
書棚__18,500818,500
デスクライト___4,20084,200
キーボード___8,90088,900

7

空白は画面では見えないので、左の列だけ空白を _ に置き換えてあります。180 の前に空白が 5 個入って 8 文字になっているのが数えられます。右の列は FM を付けたので埋めていません。

曜日や月名も空白で埋められる
SELECT DISTINCT REPLACE(TO_CHAR(juchu_on, 'Day'), ' ', '_') AS youbi, LENGTH(TO_CHAR(juchu_on, 'Day')) AS mojisu, TO_CHAR(juchu_on, 'FMDay') AS fm_youbi FROM juchu ORDER BY 1
youbimojisufm_youbi
Friday___9Friday
Saturday_9Saturday
Tuesday__9Tuesday
Wednesday9Wednesday

4

ここでも空白を _ に置き換えてあります。いちばん長い Wednesday に合わせて 9 文字にそろえられ、短い曜日ほど後ろに空白が付きます。

説明

TO_CHAR は日付や数値を、書式を指定して文字列に変える関数です。画面や帳票に出す形(2025/11/0524,800)を作るときに使います。

⚠️ 書式は綴りで意味が変わり、間違えてもエラーになりません。 取り違えやすいのが MM(月)と MI(分)です。YYYY-MI-DD と書くと、月の位置にが入った文字列が黙って返ります。動くので、目で結果を見るまで気づけません。

⚠️ 数値の書式は、符号のぶんだけ先頭に空白が入ります。 TO_CHAR(180, '999,999') は 3 文字ではなく 8 文字で、前に空白が 5 個あります。桁をそろえたいときは便利ですが、そのまま文章に混ぜると余白として見えます。外すには書式の先頭に FM を付けます。

日付側にも同じ話があり、Day(曜日)や Month(月名)はいちばん長い綴りの幅まで空白で埋められます。ここでも FMDay のように FM を付けると埋めません。

並べ替えや比較は、文字列にする前の日付のまま行ってください。TO_CHAR の結果はただの文字列なので、比べると文字の並び順になります。

ほかの製品でも通るか

この書き方が使えない製品があります そのまま使える: PostgreSQL / MariaDB / Oracle Database

  • MySQL では使えませんTO_CHAR(書式を指定して文字列にする)
  • SQLite では使えませんTO_CHAR(書式を指定して文字列にする)
  • SQL Server では使えませんTO_CHAR(書式を指定して文字列にする)

未確認: IBM Db2

製品ごとの対応表(根拠つき)を見る

次に読む

関係する関数

根拠にした一次情報