助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26808
問題を開く
現在の日付は2012年06月23日です。
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';

 

SQLを表示
SELECT SYSDATE - TO_DATE('99-04-01', 'RR-MM-DD')
FROM dual;



 
SQLを表示
SELECT SYSDATE - TO_DATE('1999-Apr-01', 'YYYY-Mon-DD')
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パラメータ])

 
 

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;

上に戻る

to_date(sysdate, ...)

公開日 2023/12/17

SELECT TO_DATE(SYSDATE, 'RR-MM-DD') - TO_DATE('99-04-01', 'RR-MM-DD') FROM dual;が正解とされています。しかし、to_date(sysdate, '書式')は挙動が変に感じます。defaultの書式と同じ書式が指定されていれば、試験では、挙動の不安定さは無視されているのでしょうか?

https://stackoverflow.com/questions/14108022/to-date-function-with-sysdate

スタッフからの返信

s staff_ishii

2023/12/18 09:09

kkjjj さん ご指摘の点を修正いたしました。 ご報告、誠にありがとうございました。

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