「顧客」の生年月日から年齢を計算する必要があります。
私は次を使用しようとしました:
DATEDIFF(year、customer.dob、 "2010-01-01");
しかし、うまくいかないようです。
何か案は?私はそれが簡単なものになることを知っています!
ありがとう
いくつかの方法:
select DATEDIFF(customer.dob, '2010-01-01') / 365.25 as age
SELECT DATE_FORMAT(FROM_DAYS(DATEDIFF(customer.dob,'2010-01-01')), ‘%Y’)+0 AS age
これがあなたを助けることを願っています
SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(dob, '00-%m-%d')) AS age
推奨されるMysqlを使用:
TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS age;
クエリでの使用:
SELECT name, dob, TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS age FROM pet;
参照: http://dev.mysql.com/doc/refman/5.0/en/date-calculations.html
Bryan Dennyの回答は受け入れられた回答よりも正確です(新しい回答以外の場所にこれを配置する方法がわかりませんでした。これはStackOverflowで初めてです)。
マルコスの最初の試み:
select DATEDIFF(customer.dob, '2010-01-01') / 365.25 as age
最初に否定的な結果を生成し(DATEDIFFへの引数の順序が間違っています)、次に、一部の日付に対して不正確な結果を生成します。
SELECT DATEDIFF('2010-05-11','1984-05-11') / 365.25 AS age
結果を生成します:
25.9986
単純に常に切り上げることはできません。これは、他の入力に対して不正確な結果を引き起こすためです。
マルコスの2回目の試み:
SELECT DATE_FORMAT(FROM_DAYS(DATEDIFF(customer.dob,'2010-01-01')), ‘%Y’)+0 AS age
繰り返しますが、引数の順序は間違っていますが、今回は負の数を生成する代わりに、FROM_DAYS()関数は負の入力では正しく機能しません。第二に、FROM_DAYS()関数の出力を詳しく見ると:
select from_days(datediff('2010-09-16','1984-05-11'));
上記の結果は次のとおりです。
0026-05-08
文字通り「26年5月8日(0の後)」です。日時タイプには月「0」がないため、この形式を使用して月を含む日付間隔を測定する場合は、月から1を引く必要があります。同様に、日コンポーネントでは「0」がないため、日付が誕生日である場合、この問題に対して期待される結果は得られません。
select from_days(datediff('2010-05-11','1984-05-11'));
生成するもの:
0025-12-31
marcosの日付フォーマットを使用して短縮すると、「25」が得られますが、これは年齢の誤った計算です。
ブライアン・デニーの答えは、これらすべてのエッジのケースで正しいです。彼の式は非常に巧妙です:
SELECT DATE_FORMAT(reference, '%Y') - DATE_FORMAT(birthdate, '%Y') - (DATE_FORMAT(reference, '00-%m-%d') < DATE_FORMAT(birthdate, '00-%m-%d')) AS age
最初の部分は、2つの日付の年の差を計算します。したがって、「2010」と「1984」をそれぞれ参照と生年月日とすると、結果は「26」になります。 2番目の部分は、基本的に「生年月日は参照月日より後に発生しますか?」を計算します。もしそうなら、それは「まだ起こっていない」ので、これを補うために年差からさらに1を引く必要があります。これは、<比較の結果によって処理され、trueの場合は1を返し、falseの場合は0を返します。
したがって、完全な例:
1)
Reference date: 2010-05-10;
Birthdate: 1984-05-11
Year difference = 2010 - 1984 = 26
Month and day comparison: May 10th < May 11th? Yes => subtract an additional year
Calculated age: 25 years
2)
Reference date: 2010-05-11;
Birthdate: 1984-05-11
Year difference = 2010 - 1984 = 26
Month and day comparison: May 11th < May 11th? No => subtract 0
Calculated age: 26 years
これが人々にとって物事を明確にすることを願っています!
以下のSQLは私のためにうまく機能します。常にCURRENT_DATE
dobで実際の年齢を計算します。
SELECT
DATE_FORMAT(
FROM_DAYS(
DATEDIFF(CURRENT_DATE, dob)
),
'%y Years %m Months %d Days'
) AS age
FROM
users
SELECT *, YEAR(CURDATE()) - YEAR(birthdate) AS age FROM user;
私は年齢を計算するための以下の記事からいくつかの有用なクエリを見つけました:-http://www.gizmola.com/blog/archives/archives/107-Calculate-a-persons-age-in-a-MySQL-query.html
DATE_FORMAT(FROM_DAYS(DATEDIFF(CURDATE(),'1869-10-02')), '%Y')+0 AS age;
上記のMySQLクエリはテストおよび検証されています。それはあなたに年で正確な年齢を与えます。私はマルコスの答えからこのアイデアを取り入れ、DATEDIFF()パラメーターを切り替えました。
DELIMITER $$ DROP FUNCTION IF EXISTS `test`.`_AGE` $$
CREATE FUNCTION `_AGE`(in_dob datetime) RETURNS VARCHAR(100)
NO SQL
BEGIN
DECLARE l_age VARCHAR(100);
DECLARE YEARS INT(11);
DECLARE MONTHS INT(11);
DECLARE DAYS INT(11);
DECLARE DIFFS FLOAT;
SET DIFFS=DATEDIFF(CURRENT_DATE(),in_dob) /365.25;
SET YEARS=FLOOR(DIFFS) ;
SET MONTHS=FLOOR((DIFFS - YEARS)*365.25/30.4375) MOD 12;
SET DIFFS=((DIFFS - YEARS)*365.25/30.4375);
SET DAYS=CEIL(((DIFFS-MONTHS)*30.4375)) MOD 31;
SET l_age=CONCAT(YEARS, " Year ",MONTHS," Month ",DAYS," Days");
RETURN(l_age);
END $$
DELIMITER ;
SELECT _Age(CAST('1980-07-16' AS DATE));
ニーズによって異なります-提供されるintおよびfloat関数。
-ビジネスルールは異なる可能性があるため、適宜調整してください
DROP FUNCTION IF EXISTS `age`;
CREATE FUNCTION `age` (
`pdate_begin` DATE,
`pdate_end` DATETIME
) RETURNS INT(11) UNSIGNED
COMMENT 'Calc age between two dates as INT'
DETERMINISTIC NO SQL SQL SECURITY DEFINER
RETURN floor(datediff(pdate_end, pdate_begin) / 365.25) ;
DROP FUNCTION IF EXISTS `age_strict`;
CREATE FUNCTION `age_strict` (
`pdate_begin` DATE,
`pdate_end` DATETIME
) RETURNS decimal(10,4)
COMMENT 'Calc age between two dates as DECIMAL .4'
DETERMINISTIC NO SQL SQL SECURITY DEFINER
RETURN round(datediff(pdate_end, pdate_begin) / 365.25, 4) ;
-- test harness
select
age(dob, now()) as age_int,
age_strict(dob, now()) as age_dec
from customer
where dob is not null
order by age(dob,now()) desc;
-- test results
dob, age_int, age_dec
1981-01-01 00:00:00 33 33.9713
1987-01-09 00:00:00 27 27.9507
2014-11-25 00:00:00 0 0.0739