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

后端 未结 10 1936
萌比男神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:46

    Find out Year - Month- Day between two Days in Orale Sql


    select 
    trunc(trunc(months_between(To_date('20120101', 'YYYYMMDD'),to_date('19910228','YYYYMMDD')))/12) years ,
    trunc(months_between(To_date('20120101', 'YYYYMMDD'),to_date('19910228','YYYYMMDD'))) 
    -
    (trunc(trunc(months_between(To_date('20120101', 'YYYYMMDD'),to_date('19910228','YYYYMMDD')))/12))*12
    months,
                 round(To_date('20120101', 'YYYYMMDD')-add_months(to_date('19910228','YYYYMMDD'),
                               trunc(months_between(To_date('20120101', 'YYYYMMDD'),to_date('19910228','YYYYMMDD'))))) days
            from dual;
    
    0 讨论(0)
  • 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).

    0 讨论(0)
  • 2020-12-31 07:53

    is this what you've ment ?

    select trunc(months_between(To_date('20120325', 'YYYYMMDD'),to_date('20120101','YYYYMMDD'))) months,
                 round(To_date('20120325', 'YYYYMMDD')-add_months(to_date('20120101','YYYYMMDD'),
                               trunc(months_between(To_date('20120325', 'YYYYMMDD'),to_date('20120101','YYYYMMDD'))))) days
            from dual;
    
    0 讨论(0)
  • 2020-12-31 07:53

    Here I'm just doing the difference between today, and a CREATED_DATE DATE field in a table, which obviously is a date in the past:

    SELECT  
    ((FLOOR(ABS(MONTHS_BETWEEN(CREATED_DATE, SYSDATE))) / 12) * 12) || ' months, '  AS MONTHS,
    -- we take total days - years(as days) - months(as days) to get remaining days
    FLOOR((SYSDATE - CREATED_DATE) -      -- total days
    (FLOOR((SYSDATE - CREATED_DATE)/365)*12)*(365/12) -      -- years, as days
    -- this is total months - years (as months), to get number of months, 
    -- then multiplied by 30.416667 to get months as days (and remove it from total days)
    FLOOR(((SYSDATE - CREATED_DATE)/365)*12 - (FLOOR((SYSDATE - CREATED_DATE)/365)*12)) * (365/12))
    || ' days ' AS DAYS 
    FROM MyTable
    

    I use (365/12), or 30.416667, as my conversion factor because I'm using total days and removing years and months (as days) to get the remainder number of days. It was good enough for my purposes, anyway.

    0 讨论(0)
  • 2020-12-31 07:55

    MsSql Syntax : DATEDIFF ( datepart , startdate , enddate )

    Oracle: This will returns number of days

        select
      round(Second_date - First_date)  as Diff_InDays,round ((Second_date - First_date) / (30),1)  as Diff_InMonths,round ((Second_date - First_date) * (60*24),2)  as TimeIn_Minitues
    from
      (
      select
        to_date('01/01/2012 01:30:00 PM','mm/dd/yyyy hh:mi:ss am') as First_date
       ,to_date('05/02/2012 01:35:00 PM','mm/dd/yyyy HH:MI:SS AM') as Second_date
      from
        dual
      ) result;
    

    Demo : http://sqlfiddle.com/#!4/c26e8/36

    0 讨论(0)
  • 2020-12-31 07:59
    select 
      dt1, dt2,
      trunc( months_between(dt2,dt1) ) mths, 
      dt2 - add_months( dt1, trunc(months_between(dt2,dt1)) ) days
    from
    (
        select date '2012-01-01' dt1, date '2012-03-25' dt2 from dual union all
        select date '2012-01-01' dt1, date '2013-01-01' dt2 from dual union all
        select date '2012-01-01' dt1, date '2012-01-01' dt2 from dual union all
        select date '2012-02-28' dt1, date '2012-03-01' dt2 from dual union all
        select date '2013-02-28' dt1, date '2013-03-01' dt2 from dual union all
        select date '2013-02-28' dt1, date '2013-04-01' dt2 from dual union all
        select trunc(sysdate-1)  dt1, sysdate               from dual
    ) sample_data
    

    Results:

    |                        DT1 |                       DT2 | MTHS |     DAYS |
    ----------------------------------------------------------------------------
    |  January, 01 2012 00:00:00 |   March, 25 2012 00:00:00 |    2 |       24 |
    |  January, 01 2012 00:00:00 | January, 01 2013 00:00:00 |   12 |        0 |
    |  January, 01 2012 00:00:00 | January, 01 2012 00:00:00 |    0 |        0 |
    | February, 28 2012 00:00:00 |   March, 01 2012 00:00:00 |    0 |        2 |
    | February, 28 2013 00:00:00 |   March, 01 2013 00:00:00 |    0 |        1 |
    | February, 28 2013 00:00:00 |   April, 01 2013 00:00:00 |    1 |        1 |
    |   August, 14 2013 00:00:00 |  August, 15 2013 05:47:26 |    0 | 1.241273 |
    

    Link to test: SQLFiddle

    0 讨论(0)
提交回复
热议问题