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)
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)
希望这对你有所帮助
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
小智 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)
我希望这能让人们更加清楚!
下面的 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)