助け合いフォーラム

Oracle DB

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;

正解

正常に実行され、「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文の実行結果は次のようになります。


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パラメータ])

 
 
SQLを表示
SELECT TO_DATE('2012-5-21', 'YYYY-MM-DD')
FROM dual;


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



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


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



 
SQLを表示
SELECT TO_DATE('2012年5月21日', 'YYYY年MM月DD日')
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;



 
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;
上に戻る

RRの考え方

投稿日 2026/10/15

解説下部にある、「RR」と「YY」の違いの話を踏まえると、解答は1999-12-31だと思うのですが。
現在の西暦は2015年→下2桁「15」
指定された西暦は2099年→下2桁「99」
てことは、現在の世紀から一つ前に戻るという認識ですが。

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