0

我正在尝试确定我的数据库中列出的人员的年龄。这是我想出的,但我似乎无法将查询限制为仅显示 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
4

3 回答 3

1

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

SELECT * 
FROM patientdetails 
WHERE DATEDIFF(CURRENT_DATE, STR_TO_DATE(p.DOB, '%d-%m-%Y'))/365 < 19
于 2012-10-01T19:38:10.653 回答
0

您不需要子查询:

SELECT *
FROM PatientDetails pd
WHERE DATEDIFF(CURRENT_DATE, STR_TO_DATE(p.DOB, '%d-%m-%Y'))/365 <19
于 2012-10-01T19:38:03.620 回答
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 文档中得到了解决和解释,但对我来说似乎有点倒退:

SELECT name, birth, CURDATE(),
(YEAR(CURDATE())-YEAR(birth))
- (RIGHT(CURDATE(),5)<RIGHT(birth,5))
AS age
FROM pet
于 2012-10-22T02:53:31.613 回答