0

我有一个包含这些值的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`

仍然为空...

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

谢谢 !

4

3 回答 3

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')。

于 2012-06-20T19:47:11.370 回答
1

你写错了,你用nulllif而不是IFNULL试试这个:

SELECT AVG(IFNULL(YEAR(NOW())-YEAR(Birthdate), 0)) AS AvgAge FROM `User`
于 2012-06-20T19:45:00.900 回答
0

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

所以我终于做到了:

SELECT AVG(IF(CONCAT('',id_user*1) = id_user, (YEAR(NOW()) - SUBSTRING(Birthdate, -4)), NULL))  AS nbUserWithCorrectDate FROM `User`
于 2012-06-20T19:58:55.797 回答