TO_CHARは数値や日時を文字列へ変換するOracle SQL関数である。

書式

日付や数値をデフォルトの書式で文字列に変換する。

TO_CHAR(expr)

指定した書式で日付や数値を文字列に変換する。

TO_CHAR(expr, format)

オラクルは関数名の大文字と小文字を区別しないので、関数名は大文字(TO_CHAR)と小文字(to_char)のどちらでもよい。

TO_CHARの引数

TO_CHARには次の引数を指定できる。

expr

文字列に変換する日付(DATE型)または数値(NUMBER型)を指定する。

format

文字列の書式を「YYYY/MM/DD」のように指定する。

書式 説明
YYYY 4桁の西暦年
YY 西暦年の2桁
RR 西暦年の2桁
MM
DD
HH 12時間表記の時
HH24 24時間表記の時
MI
SS
9 数値。正の場合は先頭に空白が付き、負の場合はマイナス記号(-)が付く。
0 数値。正の場合は先頭に空白が付き、負の場合はマイナス記号(-)が付く。桁数に足りない分は0で埋められる。
FM 書式の幅になるまで先頭を0又は末尾を空白で埋める。
FX 書式モデルと厳密に一致していなければエラーを発生させる。

デフォルトの書式

書式の指定を省略した場合は、デフォルトの書式で文字列に変換される。デフォルトの書式は、変換する値のデータ型により異なる。

デフォルトの書式
データ型 デフォルトの書式
DATE NLS_DATE_FORMATパラメータに設定された書式
TIMESTAMP NLS_TIMESTAMP_FORMATパラメータに設定された書式
TIMSTAMP WITH LOCAL TIME ZONE
TIMSTAMP WITH TIME ZONE NLS_TIMESTAMP_TZ_FORMATパラメータに設定された書式
NUMBER 有効桁数を保持するために十分な長さのVARCHAR2値

NLSパラメータは、次のSQL文で確認できる。

SQL> SELECT VALUE FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT';

VALUE
------------------
RR-MM-DD

SQL>

日付

TO_CHARを使って日付を文字列に変換する例を示す。

SQL> SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') FROM DUAL;

TO_CHAR(
--------
20160612

SQL>

現在の日付を「YYYY年MM月DD日」形式に変換する。なお、日本語の文言を付け加えるときは、二重引用符で括る。

SQL> SELECT TO_CHAR(SYSDATE, 'YYYY"年"MM"月"DD"日"') AS TODAY FROM DUAL;

TODAY
----------------------------------
2018年06月13日

SQL>

DATE型の日付を年月単位に集約する例を次に示す。

payment表
payment_date payment_amount
2013/01/01 100
2013/01/31 200
2013/02/01 400
SELECT TO_CHAR(payment_date, 'yyyymm'), SUM(payment_amount) FROM payment GROUP BY TO_CHAR(payment_date, 'yyyymm')

上記の例では、payment_dateを201301や201302などでグループ化してpayment_amountを集計している。

数値

TO_CHARを使って数値を文字列に変換する例を示す。

SQL> SELECT TO_CHAR(1,'999') FROM DUAL;

TO_CHAR(
--------
   1

SQL>

負の数の場合は先頭にマイナス記号が付く。

SQL> SELECT TO_CHAR(-1, '000') FROM DUAL;

TO_CHAR(
--------
-001

SQL>

数値を0埋めするには、書式に「9」を使う。正の数の場合は、先頭に空白が付く。

SQL> SELECT TO_CHAR(1, '000') FROM DUAL;

TO_CHAR(
--------
 001

SQL>

正の数の場合に先頭の空白を付けたくないときは、書式に「FM」を指定する。

SQL> SELECT TO_CHAR(1, 'FM000') FROM DUAL;

TO_CHAR(
--------
001

SQL>

文字列を日付型や数値に変換する

TO_CHARは日付型や数値を文字列に変換する関数であるが、逆に文字列を日付型に変換するにはTO_DATE関数、文字列を数値に変換するにはTO_NUMBER関数を使う。