26

データベース内の人の年齢を計算しようとしています。
この単純なテーブルがあるとしましょう:

student(id, birth_date);

ここで、idは主キーです(実際、テーブルはより複雑ですが、私はそれを単純化しました)。
独身者の年齢を知りたい:

select id, datediff(curdate(),birth_date) 
from student

しかし、結果は数年ではなく数日で返されます。365で割ることができます。

select id, datediff(curdate(),birth_date) / 365
from student

しかし、それは浮動小数点値を返すので、整数が必要です。
だから私は年を計算することができました:

select id, year(curdate())-year(birth_date) 
from student

しかし、問題があります。たとえば、今は5月です。たとえば、1970年6月に生まれた人の戦争の場合、彼はまだ31歳で、32歳ではありませんが、表現は32
を返します。この問題から抜け出すことはできません。誰かが私を助けてくれますか? ?

4

9 に答える 9

93

これに遭遇した人のために:

これを行う別の方法は次のとおりです。

SELECT TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS difference FROM student

月の差については に置き換えYEARMONTH日の差については に置き換えYEARますDAY

それが役立つことを願っています!

于 2014-05-23T08:59:40.830 に答える
17
select id, floor(datediff(curdate(),birth_date) / 365)
from student

結果を整数にフローリングするのはどうですか?

于 2012-05-08T21:28:01.383 に答える
4

試す:

SELECT 
  DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birth_date)), '%Y')+0
  AS age FROM student;
于 2012-05-08T21:29:27.993 に答える
4

受け入れられた答えはほぼ正しいですが、間違った結果につながる可能性があります。

実際、/ 365うるう年は考慮されておらず、生年月日と同じ日と月の日付を比較すると、誤った結果になる可能性があります。

より正確にするには、4 年間の平均日数で割る必要があります。別名 (365 * 4) + 1 (4 年ごとのうるう年) => 365.25

そして、あなたはより正確になります:

select id, floor(datediff(curdate(),birth_date) / 365.25) from student

私のプロジェクトの1つでテストされ、機能しています。

于 2012-12-21T07:53:09.357 に答える
1

2番目のアプローチからの出力でMySQLのFLOOR()関数を使用してみませんか?すべての分数が削除され、希望する結果が得られます。

于 2012-05-08T21:28:04.250 に答える
0

これは、うるう年を考慮しても機能します。

select floor((cast(date_format('2016-02-29','%Y%m%d') as int) - cast(date_format('1966-03-01','%Y%m%d') as int)/10000);

floor()小数は必要ないので、必ず を保持してください

于 2016-12-08T18:33:33.240 に答える
0

私はこれを提案します:

DATE_FORMAT(NOW(),"%Y")
   -DATE_FORMAT(BirthDate,'%Y')
   -(
     IF(
      DATE_FORMAT(NOW(),"%m-%d") < DATE_FORMAT(BrthDate,'%m-%d'),
      1,
      0
     )
    ) as Age

これはうるう年でもうまく機能するはずです;-)

于 2013-03-26T21:19:20.050 に答える
0

これを使用して整数値を取得できます。

select id, CAST(datediff(curdate(),birth_date) / 365 as int)
from student

について読みたい場合はCONVERT()CAST() ここにリンクがあります。

于 2012-05-08T21:41:02.480 に答える