助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26872
問題を開く
EMPLOYEES表の構造を確認してください。



以下の問合せの結果と同じデータ型を返すSQL文はどれですか。

 SELECT SYSDATE - hiredate FROM employees

正解

SELECT TO_CHAR(hiredate, 'RR') + 10 FROM employees;

解説

設問のSQL文のSYSDATE - hiredate(日付値 - 日付値)は、2つの日付値間の日数を計算するので、演算結果のデータ型は数値です。
選択肢のSQL文の中では、TO_CHAR(hiredate, 'RR')で年だけ文字列として取り出し、それに数値を加算した場合、暗黙的なデータ変換が行われ数値データが返ります。

以上より、
・SELECT TO_CHAR(hiredate, 'RR') + 10 FROM employees;
が正解となります。

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

・SELECT SYSDATE + hiredate FROM employees;
日付値 + 日付値の演算はできません。エラーとなるので、誤ったSQL文です。

・SELECT TRUNC(hiredate) FROM employees;
日付値を引数に指定するTRUNC関数は、書式が省略された場合は"DD"が指定されたものとして日付データ当日の午前0時を返します。結果のデータ型は日付値です。よって、誤ったSQL文です。

 TRUNC(日付[, 書式]) : 引数で指定された日付値を切り捨てて返す

・SELECT ADD_MONTHS(hiredate, 3) FROM employees;
ADD_MONTHS関数は、引数で指定された日付のnヶ月後の日付を返す関数です。HIREDATEの日付から3か月後の日付を返すのでデータ型は日付値です。誤ったSQL文です。

・SELECT TO_NUMBER(hiredate) + 7 FROM employees;
TO_NUMBER関数は文字列を数値に変換します。引数に日付値は指定できずエラーとなるので、誤ったSQL文です。

参考

日付値に対し、加算や減算の演算を行えます。日付値に対して実行できる演算は次のとおりです。

 [日付値 + 数値, 日付値 - 数値]
 数値を日数として日付値に加算/減算します。演算結果は加算/減算後の日付値となります。

 
 

SQLを表示
SELECT SYSDATE, SYSDATE + 10 "10加算", SYSDATE - 10 "10減算"
FROM dual;


 [日付値 + 数値/24, 日付値 - 数値/24]
 数値を時間数として日付値に加算/減算します。演算結果は加算/減算後の日付値となります。

 
 
SQLを表示
SELECT TO_CHAR(SYSDATE, 'RR-MM-DD HH24:MI:SS') "SYSDATE",
TO_CHAR(SYSDATE + 12/24, 'RR-MM-DD HH24:MI:SS')"12時間加算",
TO_CHAR(SYSDATE - 12/24, 'RR-MM-DD HH24:MI:SS') "12時間減算"
FROM dual;


 [日付値 - 日付値]
 2つの日付値間の日数を計算します。演算結果は数値です。また、1日に満たない値は少数値となります。

 
 
SQLを表示
SELECT SYSDATE - hiredate
FROM employees;


なお、日付値 + 日付値の演算はできません。また、日付値に対して乗算(掛け算)や除算(割り算)もできませんので、注意しましょう。

上に戻る

日時期間の計算について

公開日 2023/03/18

お世話になります。
こちらのOracle Master Silver SQL の問題で質問なのですが、SELECT SYSDATE - hiredate FROM employeesとSELECT TO_CHAR(hiredate, 'RR') + 10 FROM employees;についてTO_CHAR(hiredate, 'RR')で年だけ文字列にして10を足したら何で同じ結果になるのでしょうか。
すみません。
解説を読んでも解らなかったので、アドバイスの程お願い致します。

2023/03/18 14:01

「同じ結果」でなく、「結果が同じデータ型」ですね。
SYSDATE - hiredateは日付型-日付型なので、日数差を数値型で返します。
そのため、「演算結果が数値型になる問合せはどれですか?」と尋ねています。
確かにTO_CHAR(hiredate, 'RR')は年だけ取り出した文字列型ですが、
TO_CHAR(hiredate, 'RR') + 10だと、演算のために数値型への暗黙的な型変換をして、結果は数値型です。


コメント

r ren4219

2023/03/18 18:00

すみません。 しっかり問題を理解してませんでした。 ありがとうございます。

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

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