Get the difference between two dates both In Months and days in sql

后端 未结 10 1977
萌比男神i
萌比男神i 2020-12-31 07:43

I need to get the difference between two dates say if the difference is 84 days, I should probably have output as 2 months and 14 days, the code I have just gives the totals

10条回答
  •  既然无缘
    2020-12-31 07:49

    Updated for correctness. Originally answered by @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 Demo :

        +--------------+--------------+-----------------+-----------+--------+
        |   DATE_1     |   DATE_2     | NUM_OF_MONTHS   | MONTH(S)  | DAY(S) |
        +--------------+--------------+-----------------+-----------+--------+
        | JAN 01 2012  | MAR 25 2012  | 2.774193548387  |        2  |     24 |
        | JAN 01 2012  | JAN 01 2013  | 12              |       12  |      0 |
        | JAN 01 2012  | JAN 01 2012  | 0               |        0  |      0 |
        | FEB 28 2013  | MAR 01 2013  | 0.129032258065  |        0  |      1 |
        | FEB 28 2013  | APR 01 2013  | 1.129032258065  |        1  |      1 |
        +--------------+--------------+-----------------+-----------+--------+
    

    Notice, how for the last two dates, Oracle reports the decimal part of months (which gives days) incorrectly. 0.1290 corresponds to exactly 4 days with Oracle considering 31 days in a month (for both March and April).

提交回复
热议问题