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);
我正在数据库中查找员工的中位年龄,但我希望 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);