$ man to-char
TO_CHAR
日付・時刻関数日付や数値を、書式を指定して文字列に変える。帳票や画面に出す形を作るときに使う。
呼び出しの形
TO_CHAR(日付, 'YYYY/MM/DD') TO_CHAR(数値, '999,999') TO_CHAR(数値, 'FM999,999')
つまずきやすいところ
MMは月、MIは分です。 取り違えてもエラーにならず、違う数字が黙って入ります。数値の書式は先頭に空白が入ります(符号のぶん)。桁をそろえたいとき以外は
FMを付けてください。DayやMonthは決まった幅まで空白で埋められます。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_id | juchu_on | surasshu | nengetsu |
|---|---|---|---|
| 1001 | 2025-11-05 | 2025/11/05 | 2025-11 |
| 1002 | 2025-11-18 | 2025/11/18 | 2025-11 |
| 1003 | 2025-12-02 | 2025/12/02 | 2025-12 |
| 1004 | 2025-12-09 | 2025/12/09 | 2025-12 |
| 1005 | 2025-12-24 | 2025/12/24 | 2025-12 |
| 1006 | 2026-01-07 | 2026/01/07 | 2026-01 |
| 1007 | 2026-01-21 | 2026/01/21 | 2026-01 |
| 1008 | 2026-02-03 | 2026/02/03 | 2026-02 |
10 行(うち 8 行を表示)
年月だけに削ると、月ごとに集計するときのキーとして使えます。
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
| tsuki | fun |
|---|---|
| 2026-02-03 | 2026-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_name | kugiri | mojisu | fm |
|---|---|---|---|
| ノート | _____180 | 8 | 180 |
| ボールペン | _____120 | 8 | 120 |
| 付箋 | _____250 | 8 | 250 |
| デスクチェア | __24,800 | 8 | 24,800 |
| 書棚 | __18,500 | 8 | 18,500 |
| デスクライト | ___4,200 | 8 | 4,200 |
| キーボード | ___8,900 | 8 | 8,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
| youbi | mojisu | fm_youbi |
|---|---|---|
| Friday___ | 9 | Friday |
| Saturday_ | 9 | Saturday |
| Tuesday__ | 9 | Tuesday |
| Wednesday | 9 | Wednesday |
4 行
ここでも空白を _ に置き換えてあります。いちばん長い Wednesday に合わせて 9 文字にそろえられ、短い曜日ほど後ろに空白が付きます。
説明
TO_CHAR は日付や数値を、書式を指定して文字列に変える関数です。画面や帳票に出す形(2025/11/05・24,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
次に読む
使い方を順に読むなら
関係する関数
根拠にした一次情報
- PostgreSQL 18 マニュアル: データ型書式設定関数(2026-09-04 確認)