助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26687
問題を開く
「2012-Apr-25」という文字列を以下の形式で表示するには、どの問い合わせを実行しますか。
ただし、実行環境は英語環境とします。

 25TH of April, Two Thousand Twelve

正解

SELECT TO_CHAR(TO_DATE('2012-Apr-25','YYYY-Mon-DD'), 'DDTH "of" FMMonth, YyyySP') FROM dual;

解説

日付を表す文字列を書式化して表示するには、文字列をTO_DATE関数で日付値に変換し、その後、TO_CHAR関数で日付書式にしたがって文字列に変換します。

設問の表示形式では、
・「年」はスペル表記
・「月」は名前表記
・「日」は順序表記
ですので、「年」には「SP」要素を指定、「月」は「MM」ではなく「Month」を指定、「日」は「TH」要素を指定しなければなりません。

また、埋め込みモードが有効になっていると、「Month」を指定した時に末尾にスペースが表示されるので、「FM」要素を指定して埋め込みモードを無効にする必要があります。

以上より、
・SELECT TO_CHAR(TO_DATE('2012-Apr-25','YYYY-Mon-DD'), 'DDTH "of" FMMonth, YyyySP') FROM dual;
が正解となります。

正解のSQL文の実行結果は次のようになります。

※日本語環境の場合は、事前に以下のSQL文を実行してセッションを英語環境に変更して下さい。
  ALTER SESSION SET NLS_DATE_LANGUAGE = 'AMERICAN';
  ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR';

 
SQLを表示
SELECT TO_CHAR(TO_DATE('2012-Apr-25','YYYY-Mon-DD'), 'DDTH "of" FMMonth, YyyySP') FROM dual;


その他の選択肢については次のとおりです。

・SELECT TO_CHAR('2012-Apr-25', 'DDTH "of" FMMonth, YyyySP') FROM dual;
TO_CHAR関数は日付値を文字列に変換します。第1引数に文字列が指定されているため、エラーとなります。

・SELECT TO_DATE('2012-Apr-25', 'DDTH "of" FMMonth, YyyySP') FROM dual;
TO_DATE関数は第1引数の文字列を第2引数の日付書式にしたがって日付値に変換しますが、文字列と日付書式が一致しないため、エラーとなります。

・SELECT TO_CHAR(TO_DATE('2012-Apr-25','YYYY-Mon-DD'), 'DD "of" Month, Yyyy') FROM dual;
このSQL文は正常に実行することができますが、「年」がスペル表記にならず「日」が順序表記になりません。また、埋め込みモードが有効となっているため、「FM」を指定して埋め込みモードを無効にしなければなりません。

参考

TO_CHAR関数は、数値や日付値を指定された書式に従って文字列に変換する関数です。
第1引数に日付値が指定された場合は、日付値を文字列へ変換します。
書式は以下の通りです。

 TO_CHAR(日付値 [, '日付書式'] [, NLSパラメータ])

 
 
SQLを表示
SELECT TO_CHAR(SYSDATE, 'YY-MM-DD HH24:MI:SS')
FROM dual;


日付書式は日付値を文字列に変換する際のフォーマットです。日付書式に使用できる主な要素は次のとおりです。



日付書式には上記の要素の他に「-」,「/」,「.」,「:」などの半角記号を含めることができ、それらはそのまま表示されます。
アルファベットやひらがな、漢字などを日付書式に含めたい場合は二重引用符(")で囲んで指定します。二重引用符(")で囲んでいない場合はエラーとなります。


 
SQLを表示
SELECT TO_CHAR(SYSDATE, 'YYYY"年"MM"月"DD"日"')
FROM dual;



 
SQLを表示
SELECT TO_CHAR(SYSDATE, 'YYYY年MM月DD日')
FROM dual;


なお、日付書式が省略された場合は、セッションのデフォルトの日付書式が使用されます。NLSパラメータが省略された場合も、セッションのデフォルト値が使用されます。

また、TO_CHAR関数に指定する日付書式要素の「DAY」,「DY」,「MONTH」,「MON」などは、SQLを実行する環境の言語環境によって表示される文字列が異なります。


 
SQLを表示
ALTER SESSION SET nls_date_language = 'JAPANESE';

SELECT TO_CHAR(SYSDATE, 'MONTH / MON / DAY / DY')
FROM dual;



 
SQLを表示
ALTER SESSION SET nls_date_language = 'AMERICAN';

SELECT TO_CHAR(SYSDATE, 'MONTH / MON / DAY / DY')
FROM dual;


また、第3引数にNLSパラメータを指定することで、関数内で使用する言語環境を任意の環境に変更することができます。


 
SQLを表示
ALTER SESSION SET nls_date_language = 'JAPANESE';

SELECT TO_CHAR(SYSDATE, 'MONTH / MON / DAY / DY', 'nls_date_language=AMERICAN')
FROM dual;


なお、日付書式の大文字、小文字は区別されます。英語環境では日付書式要素を小文字で指定した場合、表示される結果も小文字となります。


 
SQLを表示
SELECT TO_CHAR(SYSDATE, 'month / mon / day / dy', 'nls_date_language=AMERICAN')
FROM dual;


[数値で表示される要素の表記の変更]
結果が数値で表示される日付書式要素の後ろに、「TH」や「SP」などの接尾辞を指定すると、結果を順序表記に変更したり、スペル表記に変更したりすることができます。
数値で表示される日付書式要素の後ろに指定できる接尾辞は次の通りです。




 
SQLを表示
SELECT TO_CHAR(SYSDATE, 'Dd') "Dd", TO_CHAR(SYSDATE, 'Ddth') "Ddth",
TO_CHAR(SYSDATE, 'Ddsp') "Ddsp", TO_CHAR(SYSDATE, 'Ddthsp') "Ddthsp"
FROM dual;


[埋め込みモード]
日付書式要素の「DD」や「MONTH」などでは、数値が1桁の場合に先頭に0付きで表示されたり、文字の前後にスペース付きで表示されます。


 
SQLを表示
SELECT TO_CHAR(SYSDATE, 'Ddth "of" Month, YYYY')
FROM dual;


これは、埋め込みモードが有効となっているためで(デフォルトで有効となっています)、「FM」要素を指定することで埋め込みモードの有効/無効を切り替える事ができます。


 
SQLを表示
SELECT TO_CHAR(SYSDATE, 'FMDdth "of" Month, YYYY')
FROM dual;


「FM」を指定すると、指定した箇所から以降の日付書式に対して指定したことになります。また「FM」を複数指定すると、指定のたびに埋め込みモードが切り替わります。


 
SQLを表示
SELECT TO_CHAR(SYSDATE, 'fmDdth "of" fmMonth, YYYY')
FROM dual;
上に戻る

YyyySPについて

投稿日 2026/02/10

日付書式:YyyySPは先頭の文字を大文字にする認識です。
設問では 「25TH of April, Two Thousand Twelve」 と出力されるとのことですが、「25TH of April, Two thousand twelve」が正しいのではないでしょうか。

2026/02/10 23:57

設問では 「25TH of April, Two Thousand Twelve」 と出力されるとのことですが、「25TH of April, Two thousand twelve」が正しいのではないでしょうか。

確認なのですが、解説の実行例がおかしいのではないか、というご指摘でしょうか?
(私の手元に実行環境がないので自信がないのですが、kevinmm さんのところでの実行結果と異なる、ということなのだろうか?と思いまして)


コメント

k kevinmm

2026/02/11 11:19

ご返信ありがとうございます。 指摘内容はご認識のとおりです。 Yyyyを指定した場合は「文字列全体の先頭だけ大文字になる」理解をしておりましたので、25TH of April, Two thousand twelveが正しいのではと思い、起票いたしました。 ただ改めて確認したところ、その認識が誤っており、タイトルケースとなることがわかりましたので疑問は解消されました。 お時間いただきありがとうございました。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?