MYSQL 从查找中位出生日期输出中位年龄

MYSQL outputting median age from find median birth date

我正在数据库中查找员工的中位年龄,但我希望 return 不是 return 出生日期,而是 return 年龄。所以基本上我希望它从当年减去员工的出生年份以获得年龄。 因此,例如我的结果显示为“2000-01-01”,其中 id 希望显示为“17”。我的代码如下:

DROP PROCEDURE IF EXISTS medianAge;

DELIMITER //
CREATE PROCEDURE medianAge(OUT median DATE)
BEGIN
    DECLARE set_size INT(10);
    DECLARE median_index INT;
    DECLARE counter INT;
    DECLARE current_age DATE;
    DECLARE all_bdates CURSOR FOR
        SELECT bdate FROM employee ORDER BY bdate ASC;
    SET set_size = (SELECT COUNT(bdate) 
        FROM employee);
    SET median_index = FLOOR(set_size/2);
    SET counter = 0;
    OPEN all_bdates;
    WHILE counter < median_index DO
        FETCH all_bdates INTO current_age;
        SET counter = counter + 1;
    END WHILE;
    SET median = FLOOR(current_age);
END//
DELIMITER ;

CALL medianAge(@median);

SELECT @median;

年龄中位数应该是出生日期的中位数年龄,但这并不重要。您可以在没有游标的情况下计算中位数。这是一个使用变量的方法:

select avg(timestampdiff(year, bdate, curdate()) as median
from (select e.*, (@rn := @rn + 1) as rn
      from employee e cross join
           (select @rn := 0) params
      order by bdate
     ) e   -- after running this, @rn has the number of rows
where @rn in (2*rn - 1, 2*rn, 2*rn + 1);

SET 中位数 = FLOOR(DATEDIFF(now(), FLOOR(current_age)) / 365);