更新的正确性。最初由@jen 回答。
with DATES as (
select TO_DATE('20120101', 'YYYYMMDD') as Date1,
TO_DATE('20120325', 'YYYYMMDD') as Date2
from DUAL union all
select TO_DATE('20120101', 'YYYYMMDD') as Date1,
TO_DATE('20130101', 'YYYYMMDD') as Date2
from DUAL union all
select TO_DATE('20120101', 'YYYYMMDD') as Date1,
TO_DATE('20120101', 'YYYYMMDD') as Date2
from DUAL union all
select TO_DATE('20130228', 'YYYYMMDD') as Date1,
TO_DATE('20130301', 'YYYYMMDD') as Date2
from DUAL union all
select TO_DATE('20130228', 'YYYYMMDD') as Date1,
TO_DATE('20130401', 'YYYYMMDD') as Date2
from DUAL
), MONTHS_BTW as (
select Date1, Date2,
MONTHS_BETWEEN(Date2, Date1) as NumOfMonths
from DATES
)
select TO_CHAR(Date1, 'MON DD YYYY') as Date_1,
TO_CHAR(Date2, 'MON DD YYYY') as Date_2,
NumOfMonths as Num_Of_Months,
TRUNC(NumOfMonths) as "Month(s)",
ADD_MONTHS(Date2, - TRUNC(NumOfMonths)) - Date1 as "Day(s)"
from MONTHS_BTW;
SQLFiddle演示:
+--------------+--------------+-----------------+- ----------+--------+
| DATE_1 | DATE_2 | NUM_OF_MONTHS | 月(S) | 天(S) |
+--------------+--------------+-----------------+- ----------+--------+
| 2012 年 1 月 1 日 | 2012 年 3 月 25 日 | 2.774193548387 | 2 | 24 |
| 2012 年 1 月 1 日 | 2013 年 1 月 1 日 | 12 | 12 | 0 |
| 2012 年 1 月 1 日 | 2012 年 1 月 1 日 | 0 | 0 | 0 |
| 2013 年 2 月 28 日 | 2013 年 3 月 1 日 | 0.129032258065 | 0 | 1 |
| 2013 年 2 月 28 日 | 2013 年 4 月 1 日 | 1.129032258065 | 1 | 1 |
+--------------+--------------+-----------------+- ----------+--------+
请注意,对于最后两个日期,Oracle 如何错误地报告月份的小数部分(给出天数)。0.1290
恰好对应于4
Oracle 考虑31
一个月中的天数(3 月和 4 月)的天数。