2012-06-20 86 views
0

我应该有一个生日场论文值:AVG返回空但不

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

每id_user是100个%NUMERICS有一个正确毫米/ dd/yyyy birthdate,所以我也试过了:

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 ...

你有任何想法,为什么它呢?
也许是我的一个简单的错误,但我无法弄清楚。

谢谢!

+0

它是VARCHAR或日期时间类型的列? – duffymo

+0

类型是varchar – Kev

+0

这可能是你的问题 - YEAR函数是否知道如何处理varchar? – duffymo

回答

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')的日常或日 - 月 - 年 命令。

+0

谢谢你是这个问题!我终于通过使用SUBSTRING(出生日期-4)从出生日期开始的一年! – Kev

1

你写的不对,你用的nulllif代替IFNULL试试这个:

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

由于duffymo说,因为Birthdate列的类型是VACHAR,所以YEAR()不能工作。

所以我终于做到:

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