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`

まだNULL ..。

なぜそうなるのか分かりますか?
たぶん私の単純なエラーですが、私はそれを理解することはできません。

ありがとう !

4

3 に答える 3

1

あなたはそれを間違って書いた、あなたはこれを試すnulllif代わりに使う:IFNULL

SELECT AVG(IFNULL(YEAR(NOW())-YEAR(Birthdate), 0)) AS AvgAge FROM `User`
于 2012-06-20T19:45:00.900 に答える
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 に答える
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 に答える