Sunteți pe pagina 1din 2

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;

S-ar putea să vă placă și