よくよく考えてみると、2 つの「時間間隔」の差は、月がずれている場合には計算できないことがわかります。これは単純に、月を減算すると異なる日数になる可能性があるためです。年を引くことも、週を引くことも、日を引くこともできます...日から秒を引くことができ、年を月から引くことができます。ただし、年から日を差し引くことはできません。
例:
SQL> select timestamp'1915-07-23 00:00:00' - timestamp'1907-09-12 00:00:00' as diff_day_to_second_interval from dual; DIFF_DAY_TO_SECOND_INTERVAL --------------------------- +000002871 00:00:00
プレ>これは、1900 年 1 月 1 日を基準とする場合、15 年 7 か月 23 日から 7 年 9 か月 12 日を引いたものです。これにより、2871 日の差が生じました。
ただし、単純に 1 か月と 6 か月だけ過去にシフトした次の 2 つの例を考えてみましょう
select timestamp'1915-06-23 00:00:00' - timestamp'1907-08-12 00:00:00' as diff_day_to_second_interval from dual; DIFF_DAY_TO_SECOND_INTERVAL --------------------------- +000002872 00:00:00 select timestamp'1915-01-23 00:00:00' - timestamp'1907-03-12 00:00:00' as diff_day_to_second_interval from dual; DIFF_DAY_TO_SECOND_INTERVAL --------------------------- +000002874 00:00:00 SQL>
プレ>これにより、2872 日と 2874 日の差が生じました。
さて、可能な減算について言えば...
(a) 年ごとの間隔を差し引く
SQL> select interval'1915-07' year(4) to month - interval'1907-09' year(4) to month as diff_year_to_month_interval from dual; DIFF_YEAR_TO_MONTH_INTERVAL --------------------------- +000000007-10 select interval'1915-06' year(4) to month - interval'1907-08' year(4) to month as diff_year_to_month_interval from dual; DIFF_YEAR_TO_MONTH_INTERVAL --------------------------- +000000007-10 select interval'1915-01' year(4) to month - interval'1907-03' year(4) to month as diff_year_to_month_interval from dual; DIFF_YEAR_TO_MONTH_INTERVAL --------------------------- +000000007-10 SQL>
プレ>3 つすべてが 7 年と 10 か月の差を正しく生成します。
(b) 日から秒の間隔を引く
SQL> select interval'15 01:02:03' day(2) to second - interval'07 02:03:04' day(2) to second as diff_day_to_second_interval from dual; DIFF_DAY_TO_SECOND_INTERVAL --------------------------- +000000007 22:58:59 select interval'14 00:01:02' day(2) to second - interval'06 01:02:03' day(2) to second as diff_day_to_second_interval from dual; DIFF_DAY_TO_SECOND_INTERVAL --------------------------- +000000007 22:58:59 select interval'09 11:12:13' day(2) to second - interval'01 12:13:14' day(2) to second as diff_day_to_second_interval from dual; DIFF_DAY_TO_SECOND_INTERVAL --------------------------- +000000007 22:58:59 SQL>
プレ>3 つすべてが同じ結果を生成します。3 つすべてが、間隔値の日/時/分/秒部分の一貫したオフセットを伴う日から秒への間隔の減算であるためです。
(c) 年次間隔の減算
私が言ったように:不可能です。 Oracle には、年ごとの間隔というものさえありません。 DB サーバーのメーカーは、それらをエンジンに追加しないことにした理由を知っていました。