このトピックでは、PolarDB for PostgreSQL (Compatible with Oracle) でサポートされているデータ型フォーマット機能について説明します。
PostgreSQLフォーマット関数は、さまざまなデータ型 (日付 /時刻、整数、浮動小数点、数値) をフォーマットされた文字列に変換し、フォーマットされた文字列から特定のデータ型に変換するための強力なツールセットを提供します。 これらの関数はすべて一般的な呼び出し規則に従います。最初の引数は書式設定する値で、2番目の引数は出力または入力形式を定義するテンプレートです。
書式設定関数
指定された形式に従って、タイムスタンプを文字列に変換します。
|
指定された形式に従って間隔を文字列に変換します。
|
指定された形式に従って数値を文字列に変換します。
|
指定された形式に従って文字列を日付に変換します。
|
指定された形式に従って文字列を数値に変換します。
|
指定された形式に従って、文字列をタイムスタンプに変換します。
|
に_timestampとに_dateが存在し、単純なキャストでは変換できない入力形式を処理します。 ほとんどの標準的な日付 /時刻形式では、ソース文字列を必要なデータ型にキャストするだけで機能し、はるかに簡単です。 同様に、標準の数値表現にはto_numberは不要です。
to_charの出力テンプレート文字列には、特定のパターンが認識され、指定された値に基づいて適切にフォーマットされたデータに置き換えられます。 テンプレートパターンではないテキストは、単に逐語的にコピーされます。 同様に、(他の関数のための) 入力テンプレート文字列において、テンプレートパターンは、入力データ文字列によって供給される値を識別する。 テンプレート・パターンでない文字がテンプレート・ストリング内に存在する場合、入力データ・ストリング内の対応する文字は、単純にスキップされる (それらがテンプレート・ストリング文字と等しいか否かにかかわらず) 。
次の表は、日付と時刻の値の書式設定に使用できるテンプレートパターンを示しています。
日付 /時刻フォーマットのテンプレートパターン
パターン | 説明 |
| 1日の時間 (01-12) |
| 1日の時間 (01-12) |
| 1日の時間 (00-23) |
| 分 (00-59) |
| 2番目 (00-59) |
| ミリ秒 (000-999) |
| microsecond (000000-999999) |
| 第2の10分の1 (0-9) |
| 秒の百分の一 (00-99) |
| ミリ秒 (000-999) |
| 10分の1ミリ秒 (0000-9999) |
| ミリ秒の百分の一 (00000-99999) |
| microsecond (000000-999999) |
| 真夜中過ぎの秒 (0-86399) |
| meridiemインジケータ (期間なし) |
| meridiemインジケーター (期間付き) |
| 年 (4桁以上) 、コンマ付き |
| 年 (4桁以上) |
| 年の最後の3桁 |
| 年の最後の2桁 |
| 年の最後の桁 |
| ISO 8601週-年の番号付け (4桁以上) |
| ISO 8601週の最後の3桁-年の番号付け |
| ISO 8601週の最後の2桁-年の番号付け |
| ISO 8601週の最後の桁-年の番号付け |
| 时代インジケータ (期间なし) |
| eraインジケーター (ピリオド付き) |
| 完全な大文字の月の名前 (9つの文字に空白のパッド) |
| フル大文字の月名 (空白-9文字に埋められた) |
| 完全な小文字の月の名前 (9つの文字に空白のパッド) |
| 大文字の略称 (英語で3つの文字、ローカライズされた長さは異なります) |
| 省略された大文字の月の名前 (英語で3つの文字、ローカライズされた長さは異なります) |
| 小文字の小文字の名前 (英語で3つの文字、ローカライズされた長さは異なります) |
| 月番号 (01-12) |
| 完全な大文字の日の名前 (9つの文字に空白のパッド) |
| フル大文字の日名 (空白-9文字に埋められた) |
| 完全な小文字の日名 (9つの文字に空白のパッド) |
| 省略形の大文字の名前 (英語で3つの文字、ローカライズされた長さは異なります) |
| 省略形の大文字の日名 (英語で3つの文字、ローカライズされた長さは異なります) |
| 省略形の小文字の名前 (英語で3つの文字、ローカライズされた長さは異なります) |
| 年の日 (001-366) |
| ISO 8601週の日-年の番号付け (001-371; 年の1日目は最初のISO週の月曜日です) |
| 月の日 (01-31) |
| 曜日、日曜日 ( |
| ISO 8601曜日、月曜日 ( |
| 月の週 (1-5) (最初の週は月の最初の日に始まります) |
| 週番号 (1-53) (最初の週は年の最初の日に始まります) |
| ISOの週番号8601週番号年 (01-53; 年の最初の木曜日は週1) |
| 世紀 (2桁) (21世紀は2001-01-01に始まります) |
| ジュリアンデート (紀元前4714年11月24日からの整数日、現地の深夜) |
| quarter |
| 大文字の月ローマ数字 (I-XII; I=1月) |
| 小文字のローマ数字の月 (i-xii; i=1月) |
| 大文字のタイムゾーンの省略形 ( |
| 小文字のタイムゾーンの省略形 ( |
| タイムゾーン時間 |
| タイムゾーン分 |
| UTCからのタイムゾーンオフセット ( |
修飾子を任意のテンプレートパターンに適用して、その動作を変更できます。 たとえば、FMMonthは、FM修飾子を持つMonthパターンです。 次の表は、日付 /時刻フォーマットの修飾子パターンを示しています。
日付 /時刻フォーマットのテンプレートパターン修飾子
修飾子 | 説明 | 例 |
| フィルモード (先行ゼロとパディング空白を抑制) |
|
| 大文字序数サフィックス |
|
| 小文字序数サフィックス |
|
| 固定形式グローバルオプション (使用法の注意を参照) |
|
| 翻訳モード (lc_timeに基づいてローカライズされた日と月の名前を使用) |
|
| スペルモード (非実装) |
|
日付 /時刻の書式設定の使用法のメモ:
FMは、そうでなければパターンの出力を固定幅にするために追加されるであろう先行ゼロおよび後続ブランクを抑制する。 InPostgreSQLでは、FMは次の仕様のみを変更しますが、OracleではFMは後続のすべての仕様に影響し、繰り返されるFM修飾子は塗りつぶしモードのオンとオフを切り替えます。TMは、FMが指定されているかどうかにかかわらず、後続のブランクを抑制します。to_timestampおよびto_dateは入力の大文字小文字を無視します。たとえば、MON、Mon、monはすべて同じ文字列を受け入れます。TM修飾子を使用する場合は、関数の入力照合の規則に従って大文字と小文字の折りたたみが行われます。_timestampおよびto_dateは、FXオプションが使用されていない限り、入力文字列の先頭と日付と時刻の値の周りの複数の空白をスキップします。 たとえば、to_timestamp('2000 JUN', 'YYYY MON')およびto_timestamp('2000 − JUN', 'YYYY − MON')は機能するが、to_timestamp('2000 JUN', 'FXYYYY MON')は、to_timestampが1つのスペースしか期待しないため、エラーを返す。FXは、テンプレートの最初のアイテムとして指定する必要があります。FXオプションが使用されていない限り、to_timestampおよびto_dateのテンプレート文字列の区切り文字 (空白文字または文字以外 /数字以外の文字) は、入力文字列の任意の区切り文字と一致するか、スキップされます。 たとえば、to_timestamp('2000JUN', 'YYYY/// MON')とto_timestamp('2000/JUN', 'YYYY MON')は機能しますが、to_timestamp('2000 // JUN', 'YYYY/MON')は入力文字列の区切り文字の数がテンプレートの区切り文字の数を超えるためエラーを返します。FXを指定した場合、テンプレート文字列の区切り文字は入力文字列の1文字と正確に一致します。 ただし、入力文字列の文字は、テンプレート文字列の区切り文字と同じである必要はありません。 たとえば、to_timestamp('2000/JUN', 'FXYYYY MON')は機能しますが、to_timestamp('2000/JUN', 'FXYYYY MON')は、テンプレート文字列の2番目のスペースが入力文字列から文字Jを消費するため、エラーを返します。TZHテンプレートパターンは、符号付きの番号と一致します。FXオプションがないと、マイナス記号があいまいになり、セパレータとして解釈される可能性があります。 テンプレート文字列のTZHの前のセパレータの数が入力文字列のマイナス記号の前のセパレータの数よりも少ない場合、マイナス記号はTZHの一部として解釈されます。 それ以外の場合、マイナス記号は値間の区切り文字と見なされます。 例えば、to_timestamp('2000 − 10 ', 'YYYY TZH')は− 10とTZHと一致するが、to_timestamp('2000 − 10', 'YYYY TZH')は10とTZHと一致する。通常のテキストは
_charテンプレートで許可され、文字通り出力されます。 テンプレートパターンが含まれている場合でも、部分文字列を二重引用符で囲み、リテラルテキストとして解釈することができます。 たとえば、'"Hello Year" YYYY'では、YYYYは年データに置き換えられますが、yearの単一のYは置き換えられません。to_date、to_number、およびto_timestampでは、リテラルテキストと二重引用符文字列が文字列に含まれる文字数をスキップします。たとえば、"XX"は2つの入力文字 (XXかどうか) をスキップします。
- 説明
PostgreSQL 12以前は、入力文字列の任意のテキストを文字以外または数字以外の文字を使用してスキップすることができました。 たとえば、
to_timestamp('2000y6m1d', 'yyyy-MM-DD ')が使用されます。 これで、この目的には文字のみを使用できます。 たとえば、to_timestamp('2000y6m1d', 'yyyytMMtDDt')およびto_timestamp('2000y6m1d', 'yyyy "y" MM "m" DD "d" ')は、y、m、およびdをスキップします。
出力に二重引用符を付けたい場合は、その前にバックスラッシュを付ける必要があります。たとえば、
'\"YYYY Month\"'です。 バックスラッシュは、二重引用符の文字列以外では特別ではありません。 二重引用符文字列内では、バックスラッシュによって次の文字が文字通りに取られます (ただし、次の文字が二重引用符または別のバックスラッシュでない限り、これは特別な効果はありません) 。to_timestampおよびto_dateにおいて、年フォーマット仕様が4桁未満、たとえばYYYであり、供給された年が4桁未満である場合、年は、たとえば95が1995になる2020年に最も近くなるように調整される。to_timestampおよびto_dateでは、負の年はBCを意味するものとして扱われます。 負の年と明示的なBCフィールドの両方を書くと、再びADになります。 年0の入力は1 BCとして扱われます。to_timestampおよびto_dateでは、YYYY変換には、4桁を超える年を処理する場合の制限があります。YYYYの後に桁以外の文字またはテンプレートを使用する必要があります。そうでない場合、年は常に4桁として解釈されます。 たとえば (年が20000):to_date('200001131', 'YYYYMMDD')は4桁の年として解釈されます。代わりに、to_date('20000-1131 ', 'YYYY-MMDD')やto_date('20000Nov31', 'YYYYMonDD')のように、年の後に非桁の区切り文字を使用します。to_timestampおよびto_dateでは、CC(世紀) フィールドは受け入れられますが、YYY、YYYY、またはY,YYYフィールドがある場合は無視されます。CCがYYまたはYとともに使用される場合、結果は指定された世紀のその年として計算されます。 世紀が指定されているが年が指定されていない場合、世紀の最初の年が想定されます。to_timestampおよびto_dateでは、平日の名前または数字 (DAY、D、および関連するフィールドタイプ) は受け入れられますが、結果を計算するためには無視されます。 同じことがクォーター (Q) フィールドにも当てはまります。to_timestampおよびto_dateでは、ISO 8601の週番号付け日 (グレゴリオ暦の日付とは異なる) を2つの方法のいずれかで指定できます。年、週番号、および平日: たとえば、
to_date('2006-42-4 ', 'IYYY-IW-ID')は、日付2006-10-19を返します。 平日を省略すると、1 (月曜日) と見なされます。年と年の日: たとえば、
to_date('2006-291 '、'IYYY-IDDD')も2006-10-19を返します。
ISO 8601の週番号フィールドとグレゴリオ暦の日付フィールドを組み合わせて日付を入力しようとすると、意味がなく、エラーが発生します。 ISO 8601の週番号付け年の文脈では、「月」または「月の日」の概念は意味を持たない。 グレゴリオ暦の文脈では、ISO週には意味がありません。
to_dateはグレゴリオ暦とISOの週番号付け日付フィールドの混合を拒否しますが、to_charは拒否しません。これは、YYYY-MM-DD (IYYY-IDDD) などの出力フォーマット仕様が役立つためです。 ただし、IYYY-MM DDのようなものを書くことは避けてください。それは今年の初め近くに驚くべき結果をもたらすでしょう。
to_timestampでは、ミリ秒 (MS) またはマイクロ秒 (US) フィールドが、小数点の後の秒桁として使用されます。 例えば、to_timestamp('12.3 ', 'SS.MS')は3ミリ秒ではなく、300である。なぜなら、変換はそれを12 + 0.3秒として扱うからである。 したがって、フォーマットSS.MSの場合、入力値12.3、12.30、および12.300は、同じミリ秒数を指定する。 3ミリ秒を得るためには、変換が12 + 0.003 = 12.003秒として扱う12.003を書かなければならない。より複雑な例を次に示します。
to_timestamp('15:12:02.020.001230 '、'HH24:MI:SS.MS.US')は15時間12分、2秒 + 20ミリ秒 + 1230マイクロ秒=2.021230秒です。to_char(... 、'ID')の曜日の番号付けはextract(isodow from ...)関数と一致しますが、to_char(... 、'D')はextract(dow from ...)の曜日の番号付けと一致しません。to_char(interval)は、HHとHH12を12時間の時計のようにフォーマットします。たとえば、ゼロ時間と36時間の両方が12として出力されますが、HH24は、interval値で23を超える可能性のあるフル時間値を出力します。
数値の書式設定に使用できるテンプレートパターンを次の表に示します。
テンプレートパターンの数値书式
パターン | 説明 |
| 桁位置 (重要でない場合は削除できます) |
| 桁位置 (重要でない場合でも、ドロップされません) |
| 小数点 |
| グループ (千) セパレータ |
| 角括弧内の負の値 |
| 番号に固定された署名 (ロケールを使用) |
| 通貨シンボル (ロケールを使用) |
| 小数点 (ロケールを使用) |
| グループ区切り (ロケールを使用) |
| 指定された位置のマイナス記号 (number < 0の場合) |
| プラス指定された位置にサインイン (number > 0の場合) |
| 指定された位置のプラス /マイナス記号 |
| ローマ数字 (1と3999の間の入力) |
| 序数サフィックス |
| 指定した桁数をシフトする (注を参照) |
| 科学表記法の指数 |
数値フォーマットの使用法ノート:
0は、先頭 /末尾のゼロが含まれている場合でも、常に印刷される桁位置を指定します。9も桁位置を指定しますが、先頭のゼロである場合はスペースに置き換えられ、末尾のゼロでフィルモードが指定されている場合は削除されます。 (to_number()の場合、これら2つのパターン文字は同等です。)フォーマットの小数桁数がフォーマットされている数値よりも少ない場合、
to_char()は指定された小数桁数に丸められます。パターン文字
S、L、D、Gは、現在のロケールで定義されている記号、通貨記号、小数点、数千区切り文字を表します。 パターン文字のピリオドとコンマは、ロケールに関係なく、小数点と数千の区切り記号の意味で、それらの正確な文字を表します。to_char()のパターンでサインに対して明示的なプロビジョニングが行われない場合、1つの列がサイン用に予約され、番号にアンカーされます (すぐ左に表示されます) 。Sがいくつかの9のすぐ左に現れる場合、それは同様に番号に固定されます。SG、PL、またはMIを使用してフォーマットされた記号は番号に固定されません。たとえば、to_char(-12, 'MI9999')は'-12'を生成しますが、to_char(-12, 'S9999')は'-12'を生成します。 (Oracleの実装では、9前にMIを使用することはできませんが、MIの前に9を使用する必要があります。)THはゼロ未満の値を変換せず、分数を変換しません。PL、SG、およびTHarePostgreSQLextensions。to_numberでは、LやTHなどの非データテンプレートパターンが使用されている場合、データ文字 (数字、記号、小数点、またはコンマ) でない限り、テンプレートパターンと一致するかどうかにかかわらず、対応する数の入力文字がスキップされます。 たとえば、THは2つの非データ文字をスキップします。Vwithto_charは、入力値に10 ^を乗算します。ここで、nはVに続く桁数です。to_numberを持つVは、同様に分割されます。to_charおよびto_numberは、小数点と組み合わせたVの使用をサポートしていません (たとえば、99.9V9は許可されていません) 。EEEE(科学表記法) は、数字および小数点パターン以外の他の書式パターンまたは修飾子と組み合わせて使用することはできず、書式文字列の末尾にある必要があります (たとえば、9.99EEEEが有効なパターンです) 。
特定の修飾子を任意のテンプレートパターンに適用して、その動作を変更できます。 たとえば、FM99.99は、FM修飾子が付いた99.99パターンです。 次の表は、数値フォーマットの修飾子パターンを示しています。
数値形式のテンプレートパターン修飾子
修飾子 | 説明 | 例 |
| フィルモード (末尾のゼロとパディングの空白を抑制) |
|
| 大文字序数サフィックス |
|
| 小文字序数サフィックス |
|
次の表は、to_char関数の使用例を示しています。
_charの例
式 | 結果 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|