如何从MySQL的DOB字段中获取年龄?

aad*_*tel 28 mysql select date

我需要从出生日期算出"顾客"的年龄.

我试过使用以下内容:

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

但它似乎没有用.

有任何想法吗?我知道它会变得简单!

谢谢

Bry*_*nny 48

SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(dob, '00-%m-%d')) AS age
Run Code Online (Sandbox Code Playgroud)

  • 这个比接受的答案好.谢谢发帖! (2认同)
  • 我们已经有了日期,没有必要将它们转换为字符串,然后再转换回整数。只需使用`TIMESTAMPDIFF(YEAR, dob, CURDATE())` (2认同)

Mar*_*ona 29

几种方式:

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
Run Code Online (Sandbox Code Playgroud)

希望这对你有所帮助

  • 我相信第二个解决方案将 customer.dob 和 NOW() 混淆了。它应该读.. SELECT DATE_FORMAT(FROM_DAYS(DATEDIFF('2010-01-01', customer.dob)), '%Y')+0 AS age (4认同)
  • 更简单:TIMESTAMPDIFF(YEAR,dob,CURDATE())AS年龄#以Ymd mysql格式使用dob (3认同)
  • 从技术上讲,它是 365.2425,因为能被 100 整除的年份不是闰年,除非它们也能被 400 整除。 (2认同)

alm*_*ruf 29

使用Mysql推荐:

TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS age;
Run Code Online (Sandbox Code Playgroud)

查询中的用法:

SELECT name, dob, TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS age FROM pet;
Run Code Online (Sandbox Code Playgroud)

参考:http://dev.mysql.com/doc/refman/5.0/en/date-calculations.html

  • @Roy 我没有看到这个问题:`select TIMESTAMPDIFF(YEAR, '2000-12-25', '2001-12-24'); // 0` vs `select TIMESTAMPDIFF(YEAR, '2000-12-25', '2001-12-25'); // 1` 这是迄今为止最清晰的答案。 (2认同)

小智 19

Bryan Denny的答案比接受的答案更正确(我不知道如何把它放在除了新答案之外的某个地方;这是我第一次使用StackOverflow).

马科斯的第一次尝试:

select DATEDIFF(customer.dob, '2010-01-01') / 365.25 as age
Run Code Online (Sandbox Code Playgroud)

首先会产生否定结果(DATEDIFF的参数顺序错误),其次会在某些日期产生不准确的结果,例如:

SELECT DATEDIFF('2010-05-11','1984-05-11') / 365.25 AS age
Run Code Online (Sandbox Code Playgroud)

产生结果:

25.9986
Run Code Online (Sandbox Code Playgroud)

您不能简单地总是向上舍入,因为这也会导致其他输入的结果不准确.

马科斯的第二次尝试:

SELECT DATE_FORMAT(FROM_DAYS(DATEDIFF(customer.dob,'2010-01-01')), ‘%Y’)+0 AS age
Run Code Online (Sandbox Code Playgroud)

同样,参数的顺序是错误的,除了这次,而不是仅产生一个负数,FROM_DAYS()函数不能正确地使用负输入.其次,如果我们仔细观察FROM_DAYS()函数的输出:

select from_days(datediff('2010-09-16','1984-05-11'));
Run Code Online (Sandbox Code Playgroud)

以上结果是:

0026-05-08
Run Code Online (Sandbox Code Playgroud)

字面意思是"五月八日,二十六年(0之后)".请记住,对于日期时间类型,没有月份"0",因此如果您想使用此格式来测量包含月份的日期间隔,则必须从月中减去1.类似地,对于day组件,没有"0",因此当日期恰好是生日时,结果不是您对此问题的期望:

select from_days(datediff('2010-05-11','1984-05-11'));
Run Code Online (Sandbox Code Playgroud)

生产:

0025-12-31
Run Code Online (Sandbox Code Playgroud)

如果我们缩短使用Marcos的日期格式会给我们"25",这是一个不正确的年龄计算.

Bryan Denny的答案在所有这些边缘情况下都是正确的.他的公式很聪明:

SELECT DATE_FORMAT(reference, '%Y') - DATE_FORMAT(birthdate, '%Y') - (DATE_FORMAT(reference, '00-%m-%d') < DATE_FORMAT(birthdate, '00-%m-%d')) AS age
Run Code Online (Sandbox Code Playgroud)

第一部分计算两个日期之间的年份差异.因此,如果我们分别以"2010"和"1984"作为参考和生日,结果为"26".然后,第二部分基本上计算"出生日期月和日是否出现在参考月和日之后?" 如果确实如此,它"还没有发生",所以我们需要从年份中减去额外的1来弥补这一点.这由<comparison的结果处理,如果为真则返回1,如果为假则返回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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我希望这能让人们更加清楚!


Ips*_*out 7

下面的 sql 对我来说很好用。始终CURRENT_DATE与 dob 一起使用来计算实际年龄。

SELECT 
    DATE_FORMAT(
        FROM_DAYS(
            DATEDIFF(CURRENT_DATE, dob)
        ),
        '%y Years %m Months %d Days'
    ) AS age 
FROM 
    users
Run Code Online (Sandbox Code Playgroud)


Seb*_*zer 5

最简单的方法:

timestampdiff( YEAR,birth_date,now() ) AS 年龄