web-dev-qa-db-ja.com

MySQLのD.O.Bフィールドから年齢を取得する方法は?

「顧客」の生年月日から年齢を計算する必要があります。

私は次を使用しようとしました:

DATEDIFF(year、customer.dob、 "2010-01-01");

しかし、うまくいかないようです。

何か案は?私はそれが簡単なものになることを知っています!

ありがとう

28
aadersh patel

いくつかの方法:

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

これがあなたを助けることを願っています

28
Marcos Placona
SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(dob, '00-%m-%d')) AS age
47
Bryan Denny

推奨される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

28
almaruf

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

これが人々にとって物事を明確にすることを願っています!

19
tokes

以下のSQLは私のためにうまく機能します。常にCURRENT_DATE dobで実際の年齢を計算します。

SELECT 
    DATE_FORMAT(
        FROM_DAYS(
            DATEDIFF(CURRENT_DATE, dob)
        ),
        '%y Years %m Months %d Days'
    ) AS age 
FROM 
    users
2
Ipsita Rout
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

1
Sapna Bhayal
DATE_FORMAT(FROM_DAYS(DATEDIFF(CURDATE(),'1869-10-02')), '%Y')+0 AS age;

上記のMySQLクエリはテストおよび検証されています。それはあなたに年で正確な年齢を与えます。私はマルコスの答えからこのアイデアを取り入れ、DATEDIFF()パラメーターを切り替えました。

0
S.Mishra
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));
0
Ravi Shankar

ニーズによって異なります-提供される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
0
user1218947