文字列を日〜秒期間型に変換、数値を期間型に変換
日〜秒期間型 = INTERVAL DAY TO SECOND ⇔ 年月期間型に変換する関数

- TO_DSINTERVAL ( string )

- TO_DSINTERVAL ( string [ DEFAULT ret_val ON CONVERSION ERROR ] )

- NUMTODSINTERVAL ( number , ds_interval_unit ) Oracle 8i
return [ INTERVAL DAY TO SECOND ]

string | 期間型に変換できる一定の文字列式 |
ret_val | 変換エラー時のデフォルト値 |
number | 年、月、日、時、分、または、秒の数値式(小数を含んでもよい) |
ds_interval_unit | 期間単位指定 における 日、時、分、または、秒 |

- 期間書式に従って記述された文字式 string を日〜秒期間型に変換した値
- 期間単位 xx_interval_unit を1単位として数えた number 分の期間型の値

期間の要素
期間式の要素 | ds interval unit 引数 |
日 | DAY |
時 | HOUR |
分 | MINUTE |
秒 | SECOND |
TO_DSINTERVAL 関数の内容
日、時分秒の 期間リテラル の書式
'days hours:minutes:seconds[.nano_sec]' 形式で記述された文字列を DS_INTERVAL 期間型に変換する。
月の要素 months は 9桁 、それ以下はそれぞれ [0-23]、[0-59]、[0-59]、[1秒未満のナノ秒] を整数であらわす。
nls_param は数値のセパレータ文字を設定する NLS_NUMERIC_CHARACTERS のみ使用可能と書かれているが使いどころがわかりません。小数秒の区切り文字にも関係ないようである。
NUMTODSINTERVAL 関数の内容
日、時分秒のいずれかを単位とした number を 'INTERVAL DAY TO SECOND' 期間型 に変換する。 日〜秒のどの単位かは 期間単位 ds_interval_unit の指定した内容による。number には小数を含めることもできる。
日付の差を取り扱う時の注意
NUMTODSINTERVAL の number に 「日付型 - 日付型」による差分や直接数値を指定すると割り切れずに表現できない数値の誤差によって 1秒が 0.999999999 秒になってしまうことがある。日付型同士の引き算で正しい INTERVAL 型を求めたい場合には DATE 型を 一旦 TIMESTAMP 型に CAST してから引き算を行うことが望ましい。
秒数が正しく変換されない例
DATE 型同士の引き算による 18 秒後 = 18/24/60/60 = 0.000208333333333..
SQL> select NUMTODSINTERVAL(18/24/60/60, 'DAY') from dual;
NUMTODSINTERVAL(18/24/60/60,'DAY')
-----------------------------------------------------------
+000000000 00:00:17.999999999
TO_DSINTERVAL 使用例
TO_YMINTERVAL('-999 01:02:03.123456789') ⇒ 999日 1時間 2分 3.12...89 秒前
NUMTODSINTERVAL 使用例
引数の数値を INTERVAL DAY TO SECOND 型に変換する。小数秒はタイムスタンプと同じ精度を持っている。
NUMTODSINTERVAL(100, 'DAY') ⇒ 100 日
NUMTODSINTERVAL(300, 'SECOND') ⇒ 5 分
NUMTODSINTERVAL(0.5, 'MINUTE') ⇒ 0.5 分 ⇒ 30 秒
NUMTODSINTERVAL(0.5, 'SECOND') ⇒ 0.5 秒 ⇒ 0.5 秒
SQL 関数 - TO_DSINTERVAL,NUMTODSINTERVAL 関連