助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26808
問題を開く
現在の日付は2012年06月23日です。
1999年4月1日から現在までの日数を求めるには、どのSQL文を実行しますか(該当するものをすべて選択してください)。
ただし、実行環境は英語環境とし、デフォルトの日付の表示形式は「RR-MM-DD」とします。
1999年4月1日から現在までの日数を求めるには、どのSQL文を実行しますか(該当するものをすべて選択してください)。
ただし、実行環境は英語環境とし、デフォルトの日付の表示形式は「RR-MM-DD」とします。
正解
SELECT SYSDATE - TO_DATE('99-04-01', 'RR-MM-DD') FROM dual;
SELECT SYSDATE - TO_DATE('1999-Apr-01', 'YYYY-Mon-DD') FROM dual;
解説
日付値から日付値を減算すると、2つの日付間の日数を求めることができます。
設問では「1999年4月1日」から現在までに経過した日数を求めるので、2つの日付の日付値を取得し、減算を行います。
現在の日付の日付値はSYSDATE関数で取得することができ、「1999年4月1日」の日付値はTO_DATE関数を使用して日付値を取得します。
以上より、
・SELECT SYSDATE - TO_DATE('99-04-01', 'RR-MM-DD') FROM dual;
・SELECT SYSDATE - TO_DATE('1999-Apr-01', 'YYYY-Mon-DD') FROM dual;
が正解となります。
正解のSQL文の実行結果は次のようになります。
※日本語環境の場合は事前に以下のSQL文を実行して、セッションを英語環境で日付の表示形式を「RR-MM-DD」に変更して下さい。
ALTER SESSION SET NLS_DATE_LANGUAGE = 'AMERICAN';
ALTER SESSION SET NLS_DATE_FORMAT = 'RR-MM-DD';
その他の選択肢については次のとおりです。
・SELECT TO_CHAR(SYSDATE) - '99-04-01' FROM dual;
文字列同士の演算はできませんので、エラーとなります。
・SELECT SYSDATE - TO_DATE('99-04-01', 'YY-MM-DD') FROM dual;
日付書式の「YY」を指定すると、現在の世紀の下2桁の年のを返すので、TO_DATE関数の結果「2099年4月1日」に変換されます。
・SELECT SYSDATE - TO_DATE('01-Apr-99') FROM dual;
TO_DATE関数の日付書式が省略された場合は、デフォルトの日付書式が使用されます。設問では、デフォルトの日付書式は「RR-MM-DD」ですので、文字列と日付書式が一致せず、エラーとなります。
設問では「1999年4月1日」から現在までに経過した日数を求めるので、2つの日付の日付値を取得し、減算を行います。
現在の日付の日付値はSYSDATE関数で取得することができ、「1999年4月1日」の日付値はTO_DATE関数を使用して日付値を取得します。
以上より、
・SELECT SYSDATE - TO_DATE('99-04-01', 'RR-MM-DD') FROM dual;
・SELECT SYSDATE - TO_DATE('1999-Apr-01', 'YYYY-Mon-DD') FROM dual;
が正解となります。
正解のSQL文の実行結果は次のようになります。
※日本語環境の場合は事前に以下のSQL文を実行して、セッションを英語環境で日付の表示形式を「RR-MM-DD」に変更して下さい。
ALTER SESSION SET NLS_DATE_LANGUAGE = 'AMERICAN';
ALTER SESSION SET NLS_DATE_FORMAT = 'RR-MM-DD';
SQLを表示
SELECT SYSDATE - TO_DATE('99-04-01', 'RR-MM-DD')
FROM dual;
FROM dual;
SQLを表示
SELECT SYSDATE - TO_DATE('1999-Apr-01', 'YYYY-Mon-DD')
FROM dual;
FROM dual;
その他の選択肢については次のとおりです。
・SELECT TO_CHAR(SYSDATE) - '99-04-01' FROM dual;
文字列同士の演算はできませんので、エラーとなります。
・SELECT SYSDATE - TO_DATE('99-04-01', 'YY-MM-DD') FROM dual;
日付書式の「YY」を指定すると、現在の世紀の下2桁の年のを返すので、TO_DATE関数の結果「2099年4月1日」に変換されます。
・SELECT SYSDATE - TO_DATE('01-Apr-99') FROM dual;
TO_DATE関数の日付書式が省略された場合は、デフォルトの日付書式が使用されます。設問では、デフォルトの日付書式は「RR-MM-DD」ですので、文字列と日付書式が一致せず、エラーとなります。
参考
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;
日付書式が違うのに、なぜ減算できる
y
yuchunsu
投稿日 2023/04/19
デフォルトの日付の表示形式は「RR-MM-DD」なので、現在の日付の日付値はSYSDATE関数も「RR-MM-DD」で取得していると思いますが、
「YYYY-Mon-DD」との日付書式が違うのに、なぜ下記のSQL文が正解となりますでしょうか。
SELECT SYSDATE - TO_DATE('1999-Apr-01', 'YYYY-Mon-DD') FROM dual;
この投稿に対して返信しませんか?