PostgreSQL: days/months/years between two dates

后端 未结 10 1983
旧时难觅i
旧时难觅i 2020-12-12 20:22

I am looking for a way to implement the SQLServer-function datediff in PostgreSQL. That is,

This function returns the count (as a signed integer valu

10条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-12 20:50

    I would like to expand on Riki_tiki_tavi's answer and get the data out there. I have created a datediff function that does almost everything sql server does. So that way we can take into account any unit.

    create function datediff(units character varying, start_t timestamp without time zone, end_t timestamp without time zone) returns integer
    language plpgsql
     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;
    $$;
    

提交回复
热议问题