Oracle中两个Year Month和Day值之间的差异

时间:2016-02-23 19:41:21

标签: oracle

我有两组年,月和日值。例如。 15年7个月23天7年9个月12天。可以用年,月和日来找到两个这样的值之间的差异吗?我曾想过将值转换为天数,计算差异并再次将结果转换回年,月和日?为此,我必须假设30天/月和365天/年。这种方法可以吗?

1 个答案:

答案 0 :(得分:1)

当你仔细考虑它时,你会发现当数月到位时你无法计算两个“时间间隔”的差异;仅仅因为扣除月份会导致不同的天数。你可以减去年数,你可以减去几周,你可以减去天数......你可以减去几天到几秒,你可以减去几年到几个月。但是,你不能减去年数。

示例:

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中甚至没有像年度间隔这样的东西;数据库服务器的制造商知道为什么他们决定不将这些添加到引擎中。