データ型(続き)
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
してみてください。