如何根据特定年份显示年龄?

How can show ages according specific years?

提问人:Carlos Morales 提问时间:8/25/2014 更新时间:8/25/2014 访问量:55

问:

我试图根据特定的年龄等级显示年龄。

演示如下:

CREATE TABLE clients
(date_birth date, date_anniversary date);

INSERT INTO clients
(date_birth, date_anniversary)
VALUES
('1991-01-04',NULL ),
('1992-01-05',NULL ),
('1993-01-06',NULL ),
('1994-01-07',NULL ),
('1995-01-08',NULL ),
('1996-01-09',NULL ),
('1997-01-10',NULL ),
('1998-01-11',NULL ),
('1999-08-12',NULL ) ;

这是查询,它显示了所有年龄转换。

SET @start:='0'; 
SET @end:='22';

SELECT YEAR(CURDATE())- year(date_birth) AS ages
FROM clients

我正在尝试显示 0 到 22 之间的年龄,我尝试了这个演示

SET @start:='0'; 
SET @end:='22';

SELECT YEAR(CURDATE())- year(date_birth) AS ages
FROM clients
WHERE year(date_birth) >= @start AND year(date_birth) <= @end

请有人可以帮助我或建议我吗?

提前致谢。

MySQL 数据库

评论

1赞 Marc B 8/25/2014
你的毫无意义。它等同于 .您直接将 YEARSAGES 进行比较。为什么不只是 ?请注意,这并不准确,特别是对于生日在今年晚些时候到来的人(例如,他们仍然是 21 岁)where1995 >= 0 AND 1995 <= 22WHERE YEAR(birthday) >= (YEAR(CURDATE()) - 22)
0赞 Carlos Morales 8/25/2014
对不起,我现在得到了它 SET @ start:='0';SET @ end:='22';SELECT YEAR(CURDATE())- year(date_birth) 作为客户端的年龄 其中 YEAR(CURDATE())- year(date_birth) >= @ start 和 year(curdate())- year(date_birth) <= @ end
1赞 M Khalid Junaid 8/25/2014
您还可以使用 having 子句 demo

答:

2赞 Avitus 8/25/2014 #1

将查询更改为以下内容:

SET @start:='0'; 
SET @end:='22';

SELECT YEAR(CURDATE())- year(date_birth) AS ages
FROM clients
WHERE YEAR(CURDATE())- year(date_birth) >= @start 
  AND YEAR(CURDATE())- year(date_birth) <= @end
3赞 TJ- 8/25/2014 #2

您的查询应该是

SELECT YEAR(CURDATE())- year(date_birth) AS ages
FROM clients
WHERE date_birth <= (curdate() - interval @start year) 
and date_birth >= (curdate() - interval @end year)

这也将利用您在date_birth上的索引(如果有的话)。

评论

0赞 Carlos Morales 8/25/2014
等一下,我尝试了其他日期,但无法正常工作 sqlfiddle.com/#!2/d62017/4
0赞 TJ- 8/25/2014
你的样本给了我结果。sqlfiddle.com/#!2/d62017/4/2什么不起作用?
0赞 Carlos Morales 8/25/2014
应介于 0 和 22 之间,这仅显示 0 和 21
0赞 TJ- 8/25/2014
我不这么认为。请注意,“1992-01-06”已超过22年。请注意,该月是 1 月,结果是 22 年零 7 个月(因此超过 22 年)。如果您想要更精确的示例,请使用“1992-09-06”。因此,您标记为问题答案的答案实际上是不正确的。
0赞 Carlos Morales 8/26/2014
没注意到会检查它。
1赞 John Ruddell 8/25/2014 #3

我更喜欢在查询中使用变量,这样您就不必重置它们

SELECT YEAR(CURDATE())- year(date_birth) AS ages
FROM clients
CROSS JOIN(SELECT @start := 0, @end := 22)t
HAVING ages BETWEEN @start AND @end

演示