助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26907
問題を開く
現在は西暦は2015年です。
次のSQL文を実行すると、結果はどうなりますか。
ただし、日付書式は"RR-MM-DD"とします。
SELECT TO_CHAR(TO_DATE('2099/12/31', 'RR-MM-DD'), 'YYYY-MM-DD') FROM dual;
次のSQL文を実行すると、結果はどうなりますか。
ただし、日付書式は"RR-MM-DD"とします。
SELECT TO_CHAR(TO_DATE('2099/12/31', 'RR-MM-DD'), 'YYYY-MM-DD') FROM dual;
正解
正常に実行され、「2099-12-31」が表示される
解説
TO_DATE関数は、文字列を指定された書式に従って日付値に変換する関数です。
TO_DATE(文字列 [, '日付書式'] [, NLSパラメータ])
設問のSQL文のように文字列と日付書式のフォーマットが一致しない場合、Oracle Databaseは別の書式要素の適用を試行します。
設問では、'RR-MM-DD'書式に対して、'2099/12/31'と異なるフォーマットの文字列が指定されていますが、Oracle Databaseは'RR'要素を'RRRR'要素に置き換えて試行するため、「2099/12/31」として扱われます。'RRRR'要素は明示的に4桁の数値が指定された場合、'YYYY'要素と同様にそのまま4桁の年号として扱われます。
また、「-」,「/」,「.」,「:」などの英数字以外の半角記号は、設問のように異なる記号を指定しても、内部的に区切り記号として一致させることができるのでエラーとなりません。
TO_DATE関数だけでは指定した日付書式"RR-MM-DD"で出力されますので、最後にTO_CHAR関数で"YYYY-MM-DD"という書式の文字列に変換して、4桁の西暦を表示しています。
以上より、
・正常に実行され、「2099-12-31」が表示される
が正解となります。
設問のSQL文の実行結果は次のようになります。

その他の選択肢については次のとおりです。
・TO_DATE関数で文字列と日付書式の桁数が異なるため、エラーとなる
文字列と日付書式のフォーマットが一致しない場合、Oracle Databaseは別の書式要素の適用を試行するため、今回はエラーとなりません。
・区切り記号が異なるため、エラーとなる
指定した英数字以外の記号が異なっていても、区切り記号として一致させることできるため、エラーとなりません。
・正常に実行され、「1999-12-31」が表示される
現在が2015年で、RR要素に対して「99」を指定した場合は1つ前の世紀の1999年として処理されますが、設問のように明示的に「2099」を指定した場合は、RRRR要素として4桁のYYYY要素と同様に扱われます。
TO_DATE(文字列 [, '日付書式'] [, NLSパラメータ])
設問のSQL文のように文字列と日付書式のフォーマットが一致しない場合、Oracle Databaseは別の書式要素の適用を試行します。
設問では、'RR-MM-DD'書式に対して、'2099/12/31'と異なるフォーマットの文字列が指定されていますが、Oracle Databaseは'RR'要素を'RRRR'要素に置き換えて試行するため、「2099/12/31」として扱われます。'RRRR'要素は明示的に4桁の数値が指定された場合、'YYYY'要素と同様にそのまま4桁の年号として扱われます。
また、「-」,「/」,「.」,「:」などの英数字以外の半角記号は、設問のように異なる記号を指定しても、内部的に区切り記号として一致させることができるのでエラーとなりません。
TO_DATE関数だけでは指定した日付書式"RR-MM-DD"で出力されますので、最後にTO_CHAR関数で"YYYY-MM-DD"という書式の文字列に変換して、4桁の西暦を表示しています。
以上より、
・正常に実行され、「2099-12-31」が表示される
が正解となります。
設問のSQL文の実行結果は次のようになります。

SQLを表示
SELECT TO_CHAR(TO_DATE('2099/12/31', 'RR-MM-DD'), 'YYYY-MM-DD') FROM dual;
その他の選択肢については次のとおりです。
・TO_DATE関数で文字列と日付書式の桁数が異なるため、エラーとなる
文字列と日付書式のフォーマットが一致しない場合、Oracle Databaseは別の書式要素の適用を試行するため、今回はエラーとなりません。
・区切り記号が異なるため、エラーとなる
指定した英数字以外の記号が異なっていても、区切り記号として一致させることできるため、エラーとなりません。
・正常に実行され、「1999-12-31」が表示される
現在が2015年で、RR要素に対して「99」を指定した場合は1つ前の世紀の1999年として処理されますが、設問のように明示的に「2099」を指定した場合は、RRRR要素として4桁のYYYY要素と同様に扱われます。
参考
TO_DATE関数は、文字列を指定された書式に従って日付値に変換する関数です。
書式は以下の通りです。
TO_DATE(文字列 [, '日付書式'] [, NLSパラメータ])

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

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


なお、日付書式が省略された場合は、セッションのデフォルトの日付書式が使用されます。NLSパラメータが省略された場合も、セッションのデフォルト値が使用されます。
[日付書式要素 YY と RR の違い]
日付書式の要素である「YY」と「RR」はどちらも年の下2桁を表しますが、世紀の取扱に違いがあります。

現在の年が2012年の場合に、日付書式を「YY」、「RR」、値を15、75とすると、それぞれ次のようになります。


書式は以下の通りです。
TO_DATE(文字列 [, '日付書式'] [, NLSパラメータ])

SQLを表示
SELECT TO_DATE('2012-5-21', 'YYYY-MM-DD')
FROM dual;
FROM dual;
日付書式は文字列を日付値に変換する際のフォーマットです。日付書式に使用できる主な要素は次のとおりです。

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

SQLを表示
SELECT TO_DATE('2012年5月21日', 'YYYY"年"MM"月"DD"日"')
FROM dual;
FROM dual;

SQLを表示
SELECT TO_DATE('2012年5月21日', 'YYYY年MM月DD日')
FROM dual;
FROM dual;
なお、日付書式が省略された場合は、セッションのデフォルトの日付書式が使用されます。NLSパラメータが省略された場合も、セッションのデフォルト値が使用されます。
[日付書式要素 YY と RR の違い]
日付書式の要素である「YY」と「RR」はどちらも年の下2桁を表しますが、世紀の取扱に違いがあります。

現在の年が2012年の場合に、日付書式を「YY」、「RR」、値を15、75とすると、それぞれ次のようになります。

SQLを表示
SELECT TO_CHAR(TO_DATE('15/12/31', 'YY/MM/DD'), 'YYYY/MM/DD')
FROM dual;
SELECT TO_CHAR(TO_DATE('75/12/31', 'YY/MM/DD'), 'YYYY/MM/DD')
FROM dual;
FROM dual;
SELECT TO_CHAR(TO_DATE('75/12/31', 'YY/MM/DD'), 'YYYY/MM/DD')
FROM dual;

SQLを表示
SELECT TO_CHAR(TO_DATE('15/12/31', 'RR/MM/DD'), 'YYYY/MM/DD')
FROM dual;
SELECT TO_CHAR(TO_DATE('75/12/31', 'RR/MM/DD'), 'YYYY/MM/DD')
FROM dual;
FROM dual;
SELECT TO_CHAR(TO_DATE('75/12/31', 'RR/MM/DD'), 'YYYY/MM/DD')
FROM dual;
RRの考え方
投稿日 2026/10/15
解説下部にある、「RR」と「YY」の違いの話を踏まえると、解答は1999-12-31だと思うのですが。
現在の西暦は2015年→下2桁「15」
指定された西暦は2099年→下2桁「99」
てことは、現在の世紀から一つ前に戻るという認識ですが。
この投稿に対して返信しませんか?