我有 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 ...
你知道为什么会这样吗? 也许是我的一个简单的错误,但我无法弄明白。
谢谢!
答案 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`