9.7. データ型書式設定関数

PostgreSQLの書式設定関数は多彩なデータ型(日付/時刻データ型、整数データ型、浮動小数点数データ型、数値データ型)を整形された文字列に変換したり、整形された文字列を特定のデータ型に変換する強力なツールの一式を提供しています。 表9-20にこれらを列挙しています。 これら関数は共通の呼び出し規約を踏襲しています。 最初の引数は整形される値で二番目の引数は入力書式または出力書式を定義するテンプレートです。

表 9-20. 書式設定関数

関数返り値説明
to_char(timestamp, text)textタイムスタンプを文字列に変換to_char(current_timestamp, 'HH12:MI:SS')
to_char(interval, text)text時間間隔を文字列に変換to_char(interval '15h 2m 12s', 'HH24:MI:SS')
to_char(int, text)text整数データを文字列に変換to_char(125, '999')
to_char(double precision, text)text実数、倍精度数を文字列に変換to_char(125.8::real, '999D9')
to_char(numeric, text)text数値を文字列に変換to_char(-125.8, '999D99S')
to_date(text, text)date文字列を日付に変換to_date('05 Dec 2000', 'DD Mon YYYY')
to_timestamp(text, text)timestamp文字列をタイムスタンプに変換to_timestamp('05 Dec 2000', 'DD Mon YYYY')
to_number(text, text)numeric文字列を数値に変換to_number('12,454.8-', '99G999D9S')

警告:to_char(interval, text) は廃れたもので、新規に作成するコードでは使用すべきではありません。 次のバージョンで削除する予定です。

(to_char用)出力テンプレート文字列には、それが認識され、整形される値から適切に整形されたデータで置き換えられるパターンがあります。 テンプレートパターンではないすべてのテキストは単にそのままコピーされます。 同様に、(to_char以外用)入力テンプレート文字列では、テンプレートパターンは入力されたデータ文字列の捜し出される部分と、そこで見つけ出される値を特定します。

表9-21に、日付/時刻型の値の書式に使用可能なテンプレートパターンを示します。

表 9-21. 日付/時刻型の書式テンプレートパターン

パターン説明
HH時(01-12)
HH12時(01-12)
HH24時(00-23)
MI分(00-59)
SS秒(00-59)
MSミリ秒(000-999)
USマイクロ秒(000000-999999)
SSSS深夜0時からの秒数 (0-86399)
AM or A.M. or PM or P.M.午前/午後の指定(大文字)
am or a.m. or pm or p.m.午前/午後の指定(小文字)
Y,YYYコンマ付き年(4桁以上)
YYYY年(4桁以上)
YYY年の下3桁
YY年の下2桁
Y年の下1桁
BC or B.C. or AD or A.D.紀元前後の指定(大文字)
bc or b.c. or ad or a.d.紀元前後の指定(小文字)
MONTH完全な大文字での月名(9文字になるように空白でパッド)
Month完全な大文字小文字混在した月名(9文字になるように空白でパッド)
month完全な小文字での月名(9文字になるように空白でパッド)
MON短縮形の大文字での月名(3文字)
Mon短縮形の大文字小文字混在した月名(3文字)
mon短縮形の小文字での月名(3文字)
MM月番号 (01-12)
DAY完全な大文字での曜日 (9 文字になるように空白でパッド)
Day完全な大文字小文字混在した曜日 (9 文字になるように空白でパッド)
day完全な小文字での曜日 (9 文字になるように空白でパッド)
DY短縮形の大文字での曜日 (3 文字)
Dy短縮形の大文字小文字混在した曜日 (3 文字)
dy短縮形の小文字での曜日 (3 文字)
DDD1 年通算の日にち (001-366)
DD1 月通算の日にち (01-31)
D1 週通算の日にち (1-7: 日曜日=1)
W月中の週番号 (1-5) (その月の初日がある週が第 1 週)
WW年間を通じた週番号 (1-53) (元旦のある週が第 1 週)
IWISO 週番号 (新年の最初の木曜日がある週が第 1 週)
CC世紀 (2 桁)
Jユリウス日 (紀元前 4713 年 1 月 1 日からの通算経過日) (訳注: 原文では4712BCとなっていますが、修正しています。)
Qquarter (四半期)
RMローマ数字による月 (I-XII: I=1月) (大文字)
rmローマ数字による月 (i-xii: i=1月) (小文字)
TZ時間帯名称(大文字)
tz時間帯名称(小文字)

ある種の修飾子はどのようなテンプレートパターンに対しても、その振舞いを変更するために適用することができます。 例えば、FMMonthFM修飾子の付いたMonthパターンです。 表9-22に、日付/時刻書式の修飾子パターンを示します。

表 9-22. 日付/時刻書式用のテンプレートパターン修飾子

修飾子説明
FM 接頭辞字詰めモード (空白およびゼロのパディングを無効)FMMonth
TH 接尾辞大文字の序数を追加DDTH
th 接尾辞小文字の序数を追加DDth
FX 接頭辞固定書式のグローバルオプション (使用上の注意事項参照)FX Month DD Day
SP 接尾辞スペルモード (未実装)DDSP

日付/時刻型書式の使用上の注意事項

表9-23に、数値型の値の書式設定に使用可能なテンプレートパターンを示します。

表 9-23. 数値書式用のテンプレートパターン

パターン説明
9指定された桁数での値
0前にゼロが付いた値
. (period)小数点
, (comma)グループ(3桁)区切り符号
PR負の値の角括弧表示
S(ロケール使用)マイナス記号付き負の値
L(ロケール使用)通貨記号
D(ロケール使用)小数点
G(ロケール使用)グループ区切り文字
MI(数値 < 0 であれば)指定位置にマイナス記号
PL(数値 > 0 であれば)指定位置にプラス記号
SG指定された位置にプラス/マイナス記号
RN(1 〜 3999 の入力値による)ローマ数字
TH or th序数変換
Vn 桁シフト (注意事項を参照)
EEEE科学技術表記法 (未実装)

数値型書式の使用上の注意事項

表9-24に、to_char関数を使用した例をいくつか示します。

表 9-24. to_char の例

出力
to_char(current_timestamp, 'Day, DD  HH12:MI:SS')'Tuesday  , 06  05:39:18'
to_char(current_timestamp, 'FMDay, FMDD  HH12:MI:SS')'Tuesday, 6  05:39:18'
to_char(-0.1, '99.99')'  -.10'
to_char(-0.1, 'FM9.99')'-.1'
to_char(0.1, '0.9')' 0.1'
to_char(12, '9990999.9')'    0012.0'
to_char(12, 'FM9990999.9')'0012.'
to_char(485, '999')' 485'
to_char(-485, '999')'-485'
to_char(485, '9 9 9')' 4 8 5'
to_char(1485, '9,999')' 1,485'
to_char(1485, '9G999')' 1 485'
to_char(148.5, '999.999')' 148.500'
to_char(148.5, 'FM999.999')'148.5'
to_char(148.5, 'FM999.990')'148.500'
to_char(148.5, '999D999')' 148,500'
to_char(3148.5, '9G999D999')' 3 148,500'
to_char(-485, '999S')'485-'
to_char(-485, '999MI')'485-'
to_char(485, '999MI')'485 '
to_char(485, 'FM999MI')'485'
to_char(485, 'PL999')'+485'
to_char(485, 'SG999')'+485'
to_char(-485, 'SG999')'-485'
to_char(-485, '9SG99')'4-85'
to_char(-485, '999PR')'<485>'
to_char(485, 'L999')'DM 485
to_char(485, 'RN')'        CDLXXXV'
to_char(485, 'FMRN')'CDLXXXV'
to_char(5.2, 'FMRN')'V'
to_char(482, '999th')' 482nd'
to_char(485, '"Good number:"999')'Good number: 485'
to_char(485.8, '"Pre:"999" Post:" .999')'Pre: 485 Post: .800'
to_char(12, '99V999')' 12000'
to_char(12.4, '99V999')' 12400'
to_char(12.45, '99V9')' 125'