如何确定表中人的年龄

时间:2012-10-01 19:34:41

标签: mysql

我正在尝试确定数据库中列出的人员的年龄。这就是我想出来的,但我似乎无法限制查询以显示只有18岁以下的人。

SELECT 
  * 
FROM 
  patientdetails 
WHERE 
  ageInYears IN (
    SELECT 
      DATEDIFF(CURRENT_DATE, STR_TO_DATE(p.DOB, '%d-%m-%Y'))/365 AS ageInYears 
    FROM 
      patientdetails p
  ) < 19

3 个答案:

答案 0 :(得分:1)

我相信这样的事情应该有效:

SELECT * 
FROM patientdetails 
WHERE DATEDIFF(CURRENT_DATE, STR_TO_DATE(p.DOB, '%d-%m-%Y'))/365 < 19

答案 1 :(得分:0)

您不需要子查询:

SELECT *
FROM PatientDetails pd
WHERE DATEDIFF(CURRENT_DATE, STR_TO_DATE(p.DOB, '%d-%m-%Y'))/365 <19

答案 2 :(得分:0)

这种作品:

SELECT *
FROM PatientDetails pd
WHERE DATEDIFF(CURRENT_DATE, STR_TO_DATE(pd.DOB, '%d-%m-%Y')) / 365 < 19

将天数除以365将无法适应闰年,这意味着您将获得4天的保证。你可以除以365.25,然后减去0.75。我认为可以解释一切,但我从臀部开始拍摄。我不确定这个计算是否存在整数错误。我不确定MySQL如何处理隐式类型转换。

我更倾向于这样做。从逻辑上讲,它是“所有未来19岁生日的病人”:

SELECT *
FROM PatientDetails pd
WHERE DATE_ADD( STR_TO_DATE(pd.DOB, '%d-%m-%Y'), INTERVAL 19 YEAR ) > CURDATE()

然而,这个确切的问题已在MySQL documentation for date calculations中得到解决和解释,但对我来说似乎有点ass:

SELECT name, birth, CURDATE(),
(YEAR(CURDATE())-YEAR(birth))
- (RIGHT(CURDATE(),5)<RIGHT(birth,5))
AS age
FROM pet