Months between two dates function

前端 未结 4 2072
孤城傲影
孤城傲影 2021-01-11 21:00

In oracle i can find out no:of months between using MONTHS_BETWEEN function.

In postgres i am using extract function for this. eg.like

select 
    ex         


        
相关标签:
4条回答
  • 2021-01-11 21:07
    SELECT date_part ('year', f) * 12
          + date_part ('month', f)
    FROM age (CURRENT_DATE, '2014-12-01') f
    
    0 讨论(0)
  • 2021-01-11 21:14

    This is easy to re-implement in PostgreSQL just using SQL functions to tidy up what you've already got:

    create function months_of(interval)
     returns int strict immutable language sql as $$
      select extract(years from $1)::int * 12 + extract(month from $1)::int
    $$;
    
    create function months_between(date, date)
     returns int strict immutable language sql as $$
       select abs(months_of(age($1, $2)))
    $$;
    

    And now select months_between('1978-06-20', '2011-12-09') produces 401.

    0 讨论(0)
  • 2021-01-11 21:21

    You can use UDF, e.g. I've found the following here:

       CREATE OR REPLACE FUNCTION DateDiff (units VARCHAR(30), start_t TIMESTAMP, end_t TIMESTAMP) 
         RETURNS INT AS $$
       DECLARE
         diff_interval INTERVAL; 
         diff INT = 0;
         years_diff INT = 0;
       BEGIN
         IF units IN ('yy', 'yyyy', 'year', 'mm', 'm', 'month') THEN
           years_diff = DATE_PART('year', end_t) - DATE_PART('year', start_t);
    
           IF units IN ('yy', 'yyyy', 'year') THEN
             -- SQL Server does not count full years passed (only difference between year parts)
             RETURN years_diff;
           ELSE
             -- If end month is less than start month it will subtracted
             RETURN years_diff * 12 + (DATE_PART('month', end_t) - DATE_PART('month', start_t)); 
           END IF;
         END IF;
    
         -- Minus operator returns interval 'DDD days HH:MI:SS'  
         diff_interval = end_t - start_t;
    
         diff = diff + DATE_PART('day', diff_interval);
    
         IF units IN ('wk', 'ww', 'week') THEN
           diff = diff/7;
           RETURN diff;
         END IF;
    
         IF units IN ('dd', 'd', 'day') THEN
           RETURN diff;
         END IF;
    
         diff = diff * 24 + DATE_PART('hour', diff_interval); 
    
         IF units IN ('hh', 'hour') THEN
            RETURN diff;
         END IF;
    
         diff = diff * 60 + DATE_PART('minute', diff_interval);
    
         IF units IN ('mi', 'n', 'minute') THEN
            RETURN diff;
         END IF;
    
         diff = diff * 60 + DATE_PART('second', diff_interval);
    
         RETURN diff;
       END;
       $$ LANGUAGE plpgsql;
    
    0 讨论(0)
  • 2021-01-11 21:23

    Unfortunately it seems not, because extract(month ...) returns the number of months modulo 12.

    There is one small simplification you can make; remove the first parameter of age() - the default is age from current_date, so these two are equivalent:

    age(current_date, '2012-12-09')
    age('2012-12-09')
    
    0 讨论(0)
提交回复
热议问题