Example # 1: How to get the number of days between two dates
SQL> SELECT TO_DATE('20120125', 'YYYYMMDD') - TO_DATE('20120120', 'YYYYMMDD') day_diff FROM dual
DAY_DIFF
---------5
Example # 2: How to get number of months between two dates
SQL> SELECT
2
3 FROM
MONTHS_BETWEEN(TO_DATE('20120325', 'YYYYMMDD'), TO_DATE('20120101', 'YYYYMMDD')) num_months
,(TO_DATE('20120325', 'YYYYMMDD') - TO_DATE('20120101', 'YYYYMMDD')) diff_in_days
dual
NUM_MONTHS
---------2.77419354
DIFF_IN_DAYS
-----------84
Using plain math to get the number of months between two dates
SQL> SELECT
2
3 FROM
TRUNC((TO_DATE('20120325', 'YYYYMMDD') - TO_DATE('20120101', 'YYYYMMDD')) / 30) num_months
,(TO_DATE('20120325', 'YYYYMMDD') - TO_DATE('20120101', 'YYYYMMDD')) diff_in_days
dual
NUM_MONTHS
---------2
DIFF_IN_DAYS
-----------84
Using the EXTRACT function
SQL> SELECT
TO_DATE('20120101', 'YYYYMMDD') start_date
2
,TO_DATE('20120325', 'YYYYMMDD') end_date
3
,(TO_DATE('20120325', 'YYYYMMDD') - TO_DATE('20120101', 'YYYYMMDD')) diff_in_days
4
,EXTRACT(MONTH FROM TO_DATE('20120101', 'YYYYMMDD')) start_month
5
,EXTRACT(MONTH FROM TO_DATE('20120325', 'YYYYMMDD')) end_month
6
,(EXTRACT(MONTH FROM TO_DATE('20120325', 'YYYYMMDD')) - EXTRACT(MONTH FROM TO_DATE('20120101', 'YYYYMMDD')))
diff_in_months
7 FROM
dual
START_DATE
----------1/1/2012
END_DATE
----------3/25/2012
DIFF_IN_DAYS
-----------84
START_MONTH
----------1
END_MONTH
---------3
DIFF_IN_MONTHS
-------------2
Example # 3: How to get the number of years and months between two dates
SQL> SELECT
2
3 FROM
TRUNC(MONTHS_BETWEEN(TO_DATE('20120325', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD')))
,(TO_DATE('20120325', 'YYYYMMDD') - TO_DATE('20100101', 'YYYYMMDD')) diff_in_days
dual
TRUNC(MONTHS_B
-----------------------------26
DIFF_IN_DAYS
-----------814
But, if we want to show the number of years as well, we can do something like this:
SQL> SELECT
2
3
num_years
4
num_months
5 FROM
(TO_DATE('20120525', 'YYYYMMDD') - TO_DATE('20100101', 'YYYYMMDD')) diff_in_days
,TRUNC(MONTHS_BETWEEN(TO_DATE('20120525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD')))
,TRUNC(TRUNC(MONTHS_BETWEEN(TO_DATE('20120525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))) / 12)
DIFF_IN_DAYS
-----------875
TRUNC(MONTHS_B
-----------------------------28
,MOD(TRUNC(MONTHS_BETWEEN(TO_DATE('20120525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))), 12)
dual
NUM_YEARS
---------2
NUM_MONTHS
---------4
Another way to do show the number of years and months could be something like this:
SQL> SELECT
TO_DATE('20100101', 'YYYYMMDD') start_date
2
,TO_DATE('20120525', 'YYYYMMDD') end_date
3
,(TO_DATE('20120525', 'YYYYMMDD') - TO_DATE('20100101', 'YYYYMMDD')) diff_in_days
4
,EXTRACT(YEAR FROM TO_DATE('20100101', 'YYYYMMDD')) start_month
5
,EXTRACT(YEAR FROM TO_DATE('20120525', 'YYYYMMDD')) end_month
6
,EXTRACT(MONTH FROM TO_DATE('20100101', 'YYYYMMDD')) start_month
7
,EXTRACT(MONTH FROM TO_DATE('20120525', 'YYYYMMDD')) end_month
8
,(EXTRACT(YEAR FROM TO_DATE('20120525', 'YYYYMMDD')) - EXTRACT(YEAR FROM TO_DATE('20100101', 'YYYYMMDD')))
diff_in_years
9
,(EXTRACT(MONTH FROM TO_DATE('20120525', 'YYYYMMDD')) - EXTRACT(MONTH FROM TO_DATE('20100101', 'YYYYMMDD')))
diff_in_months
10 FROM
dual
START_DATE END_DATE DIFF_IN_DAYS START_MONTH END_MONTH START_MONTH END_MONTH DIFF_IN_YEARS DIFF_IN_MONTHS
----------- ----------- ------------ ----------- ---------- ----------- ---------- ------------- -------------1/1/2010 5/25/2012
875
2010
2012
1
5
2
4
More info see:
http://oracletuts.net/tutorials/how-to-calculate-difference-between-dates-in-oracle-sql/
It is the best and simple formula to calculate Years, Months, Days between two dates
SELECT TRUNC (MONTHS_BETWEEN (:end_date, :start_date) / 12) YEARS,
MOD (TRUNC (MONTHS_BETWEEN (:end_date, :start_date)), 12) MONTHS,
( TO_DATE (:end_date) - ADD_MONTHS (:start_date, TRUNC (MONTHS_BETWEEN (:end_date, :start_date)))) DAYS
FROM DUAL;