mysql - SQL平均年龄比较函数返回null

标签 mysql sql function datetime

所以,我正在 MySQL 中工作,编写一个函数,从表中平均女性和男性的年龄并进行比较,并返回较大的值。日期的格式为 YYYY-MM-DD,我使用的是 DATEDIFF()。该函数似乎工作正常,但当我运行脚本时,我得到的只是一个带有空值的消息框,而不是它应该输出的响应。

USE tennis;

DROP PROCEDURE IF EXISTS AverAge;

DELIMITER //

CREATE PROCEDURE AverAge()
BEGIN
    DECLARE averWomen DECIMAL(3,2);
    DECLARE averMen DECIMAL(3,2);

    SELECT AVG(DATEDIFF(BIRTH_DATE,CURDATE()))
    INTO averWomen
    FROM PLAYERS
    WHERE sex = 'F';

    SELECT AVG(DATEDIFF(BIRTH_DATE,CURDATE()))  
    INTO averWomen
    FROM PLAYERS
    WHERE sex = 'M';

    IF averWomen > averMen THEN
        SELECT CONCAT('The average age of women is higher. It is ', averWomen) AS message;
    ELSEIF averMen > averWomen THEN
        SELECT CONCAT('The average age of women is higher. It is ', averMen) AS message;
    ELSE
        SELECT CONCAT('The average age of men and women is equal. It is ', averWomen, ' for women and ', averMen, ' for men.') AS message;
    END IF;
END//

DELIMITER ;

CALL AverAge();

有人能发现我哪里搞砸了吗?

编辑

USE tennis;

DROP PROCEDURE IF EXISTS AverAge;

DELIMITER //

CREATE PROCEDURE AverAge()
BEGIN
    DECLARE averWomen DECIMAL(10,6);
    DECLARE averMen DECIMAL(10,6);

    SELECT AVG(EXTRACT(year FROM CURDATE()) - EXTRACT(YEAR FROM BIRTH_DATE))
    INTO averWomen
    FROM PLAYERS
    WHERE SEX = 'F';

    SELECT AVG(EXTRACT(year FROM CURDATE()) - EXTRACT(year FROM BIRTH_DATE))
    INTO averMen
    FROM PLAYERS
    WHERE SEX = 'M';

    IF averWomen > averMen THEN
        SELECT CONCAT('The average age of women is higher. It is ', averWomen) AS message;
    ELSEIF averMen > averWomen THEN
        SELECT CONCAT('The average age of women is higher. It is ', averMen) AS message;
    ELSE
        SELECT CONCAT('The average age of men and women is equal. It is ', averWomen, ' for women and ', averMen, ' for men.') AS message;
    END IF;
END//

DELIMITER ;

CALL AverAge();

所以,这就是我所做的有效的。

最佳答案

当您声明变量 averMen 时,您尚未初始化它。应该计算 averMen 的查询正在计算 averWomen。

尝试改变...

SELECT AVG(DATEDIFF(BIRTH_DATE,CURDATE()))  
INTO averWomen
FROM PLAYERS
WHERE sex = 'M';

进入

SELECT AVG(DATEDIFF(BIRTH_DATE,CURDATE()))  
INTO averMen
FROM PLAYERS
WHERE sex = 'M';

关于mysql - SQL平均年龄比较函数返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30834823/

相关文章:

mysql - 复杂的SQL join 根据给定的结构进行查询

MySQL:SQL插入查询以复制同一张表中的数据

c - 编写采用非空 double 组及其长度作为参数并返回 : 的函数

javascript - 在 javascript 中使用正则表达式相对于 toString 方法进行函数反编译的优点

php - 这个sql输入验证安全吗?

MYSQL:使用连接更新基于 select 语句的列

sql - 有限制的多对多关系的数据库设计

mysql - 有关电影主题的 sql 遇到问题

java - 如何在JAVA(ResultSet)中检查合并查询是否成功?

javascript - 基本 jQuery slideUp/slideDown 帮助