日付関数の問題
問3
emp表には、入社日を扱うhiredate列(DATE型)があります。正常に実行されるのはどのSQL文ですか。
- a. SELECT hiredate + 1/24 FROM emp;
- b. SELECT hiredate + 7 FROM emp;
- c. SELECT ADD_MONTHS(hiredate,-7) FROM emp;
- d. SELECT MONTHS_BETWEEN(hiredate,7) FROM emp;
- e. SELECT NEXT_DAY(hiredate,7) FROM emp;
Oracleの日付型は、年月日だけでなく時刻(時分秒)も扱います。日付の加算(+)、減算(-)の単位は「日」です。したがって、選択肢aの+1/24は1時間後、選択肢bの+7は7日後の日付を返します。
ADD_MONTHS関数は、第1引数の日付に第2引数で指定された月数を加算した日付を返します。第2引数が正数なら加算され、負数なら減算されます。つまり、選択肢cは7か月前の日付が返されます。
MONTHS_BETWEEN関数は、第1引数と第2引数の差(月数)を戻します。したがって、2つの引数はどちらも日付型でなければならないため、選択肢dはエラーになります。
NEXT_DAY関数の第2引数は曜日で、「対象日付(第1引数)の次の○○曜日(第2引数)はいつ?」を求めます。第2引数は、曜日を表す文字列(土曜日なら'SATURDAY')や、曜日を表す数値を指定できます。曜日を表す数値は、1が日曜日で、7が土曜日です。お間違えなく。
SQL> SELECT SYSDATE, NEXT_DAY(SYSDATE,'SATURDAY'),NEXT_DAY(SYSDATE,7) 2 FROM dual; SYSDATE NEXT_DAY NEXT_DAY -------- -------- -------- 15-12-21 15-12-26 15-12-26
ということで、正解は次のとおり、選択肢a、b、c、eです。
SQL> -- a
SQL> SELECT hiredate + 1/24 FROM emp
2 WHERE deptno = 10;
HIREDATE
--------
81-06-09
81-11-17
82-01-23
SQL> -- b
SQL> SELECT hiredate + 7 FROM emp
2 WHERE deptno = 10;
HIREDATE
--------
81-06-16
81-11-24
82-01-30
SQL> -- c
SQL> SELECT ADD_MONTHS(hiredate,-7) FROM emp
2 WHERE deptno = 10;
ADD_MONT
--------
80-11-09
81-04-17
81-06-23
SQL> -- d
SQL> SELECT MONTHS_BETWEEN(hiredate,7) FROM emp
2 WHERE deptno = 10;
SELECT MONTHS_BETWEEN(hiredate,7) FROM emp
*
行1でエラーが発生しました。:
ORA-00932: データ型が一致しません: DATEが予想されましたがNUMBERです。
SQL> -- e
SQL> SELECT NEXT_DAY(hiredate,7) FROM emp
2 WHERE deptno = 10;
NEXT_DAY
--------
81-06-13
81-11-21
82-01-30
言語系の試験は、実行した結果を頭の中で想像しなければいけないので、解いていると疲れますよね。最後はシンプルな問題にしましょう。
数値関数の問題
問4
Oracle Databaseに組み込まれているSQL関数を使用して実行できる算術演算はどれですか?
- a. 乗算
- b. 徐算
- c. べき乗
- d. 商の余り
- e. 平方根
正解は、選択肢c、d、eです。
乗算と徐算はSQL関数ではなく、「*」演算子、「/」演算子で求めます。一方、べき乗はPOWER関数、商の余りはMOD関数、平方根はSQRT関数で求めます。
なお、数値関数と日付関数に関して、今回触れなかったTRUNC関数とROUND関数も大切ですので確認しておきましょう。
次回は、単一行関数のうち「変換関数」を取り上げます。予習しておいてくださいね。

