データ型(続き)
LONGの次はINTERVALに関する出題です。
問2
次の問合せを確認してください。
SELECT INTERVAL '600' YEAR TO MONTH FROM dual;
この問合せを実行すると、どのように出力されますか。最も適切なものを選択しなさい。
- a. +50
- b. +600
- c. +00-50
- d. +60-00
- e. エラーになる
さっそく実行してみましょう。
SQL> SELECT INTERVAL '600' YEAR TO MONTH FROM dual;
SELECT INTERVAL '600' YEAR TO MONTH FROM dual
*
行1でエラーが発生しました。:
ORA-01867: 間隔が無効です。
結果から分かるとおり、正解は選択肢eです(選択肢a、b、c、dは不正解)。 INTERVALというのは期間を扱うデータ型で、YEAR TO MONTHとDAY TO SECONDがあります。
INTERVAL 期間値 YEAR[(精度)] TO MONTH
INTERVAL 期間値 {DAY | HOUR | MINUTE}[(精度)] TO {HOUR | MINUTE | SECOND}[(精度)]
YEARフィールドの精度は桁数で、デフォルトは2です。したがって、600という3桁の年を扱いたいのであれば、次のように桁数を指定しなければいけません。
SQL> SELECT INTERVAL '600' YEAR(3) FROM dual; INTERVAL'600'YEAR(3) ----------------------------------- +600-00
また、「600年」という「年」だけであれば、TO MONTHは指定しません。TO MONTHと指定するなら、次のように「600年0か月」と分かるように、期間値に「月」まで明記する必要があります。
SQL> SELECT INTERVAL '600-00' YEAR(3) TO MONTH FROM dual; INTERVAL'600-00'YEAR(3)TOMONTH ----------------------------------- +600-00
当然、次の実行例で確認できるとおり、期間値に指定できる「月」は1~11までです。
SQL> SELECT INTERVAL '600-12' YEAR(3) TO MONTH FROM dual;
SELECT INTERVAL '600-12' YEAR(3) TO MONTH FROM dual
*
行1でエラーが発生しました。:
ORA-01843: 指定した月が無効です。
SQL> SELECT INTERVAL '600-11' YEAR(3) TO MONTH FROM dual;
INTERVAL'600-11'YEAR(3)TOMONTH
---------------------------------------------------------------------------
+600-11
DAY TO SECONDの期間値には、日数、HH[:MI[:SS[.n]]]、MI[:SS[.n]]またはSS[.n]の形式で時間を指定します。nは、秒の小数部で指定した精度(デフォルトは6)に四捨五入されるので注意してください。
INTERVALは「賞味期間は3年8か月」なんていうデータも扱えるので、実務でも使えると思いますよ。そもそも、ちょっと出題されただけなのに、INTERVALが「すごく出題された」という印象を与えているのは、INTERVALを使い慣れていない人が多いからだと思います。自分で任意の期間値を指定してSELECTしてみてください。

