当您仔细考虑它时,您会意识到当月份到位时,您无法计算两个“时间间隔”的差异;仅仅因为减去几个月可能会导致不同的天数。你可以减去年,你可以减去周,你可以减去天,……你可以减去天到秒,你可以减去年到月。但是,您不能减去年数。
示例:
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 个月移到过去
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>
所有三个都正确地产生了 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>
所有三个都产生相同的结果,因为所有三个都是按天/秒间隔减去间隔值的天/小时/分钟/秒部分。
(c) 减去每年的间隔
正如我所说:不可能。在 Oracle 中甚至没有逐日间隔这样的东西。数据库服务器的制造商知道为什么他们决定不将这些添加到引擎中。