AVG返回null但不应该

时间:2012-06-20 19:38:00

标签: mysql sql average

我有 Birthdate 字段,其中包含以下值:

28 Juillet 1982   (I want this one to be excluded)
09/16/1981        (This one will be used)
                  (empty, should be excluded)
03/19/1953        (This one will be used)

我想得到mm / dd / yyyy日期的平均年龄。现在我的查询是:

SELECT AVG(NULLIF(YEAR(NOW())-YEAR(Birthdate), 0)) AS AvgAge FROM `User`

我也尝试过:

SELECT AVG( YEAR(NOW())-YEAR(Birthdate) ) AS AvgAge FROM `User`

但结果总是一样的: NULL

每个100%数字的id_user都有正确的mm / dd / yyyy生日,所以我也试过了:

SELECT AVG(CASE WHEN id_user >=0 THEN YEAR( NOW( ) ) - YEAR( Birthdate ) ELSE NULL END )  AS AvgAge FROM `User`

那:

SELECT AVG(CASE WHEN CEIL(id_user) = id_user THEN YEAR( NOW( ) ) - YEAR( Birthdate ) ELSE NULL END )  AS AvgAge FROM `User`

NULL ...

你知道为什么会这样吗? 也许是我的一个简单的错误,但我无法弄明白。

谢谢!

3 个答案:

答案 0 :(得分:1)

你写错了,你使用nulllif代替IFNULL试试这个:

SELECT AVG(IFNULL(YEAR(NOW())-YEAR(Birthdate), 0)) AS AvgAge FROM `User`

答案 1 :(得分:1)

阅读本文:

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.html

我认为这种类型可能不对。

  

虽然MySQL试图解释几种格式的值,但是日期   零件必须始终以年 - 月 - 日的顺序给出(例如,   '98 -09-04'),而不是在月 - 日 - 年或日 - 月 - 年   其他地方常用的订单(例如,'09 -04-98','04 -09-98')。

答案 2 :(得分:0)

正如duffymo所说,因为Birthdate列的类型是VACHAR,所以YEAR()不起作用。

所以我终于做到了:

SELECT AVG(IF(CONCAT('',id_user*1) = id_user, (YEAR(NOW()) - SUBSTRING(Birthdate, -4)), NULL))  AS nbUserWithCorrectDate FROM `User`