2012-06-20 2 views
0

должен иметь поле BirthDate со значениями тезисах: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) 

Я хочу, чтобы получить средний возраст даты мм/дд/гггг. Сейчас мой запрос:

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% Числовые имеют правильную мм/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

ли VARCHAR или DateTime типа для этого столбца? – 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, поскольку тип столбца Дата рождения - VACHAR, YEAR() не может работать.

Так что я наконец-то сделал:

SELECT AVG(IF(CONCAT('',id_user*1) = id_user, (YEAR(NOW()) - SUBSTRING(Birthdate, -4)), NULL)) AS nbUserWithCorrectDate FROM `User` 
Смежные вопросы