【问题标题】:How to Determine the Age of a Person in aTable [duplicate]如何确定表中人的年龄[重复]
【发布时间】:2012-10-01 19:34:41
【问题描述】:

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我相信这样的事情应该可行:

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

    【讨论】:

    • 找到零个结果。我知道这确实返回值。 SELECT DATEDIFF(CURRENT_DATE, STR_TO_DATE(p.DOB, '%d-%m-%Y'))/365 AS ageInYears FROM patientdetails p
    • 您能发布一些该查询的示例结果吗?
    • NVM,我明白我做错了什么,你的查询很好。谢谢^^
    【解决方案2】:

    您不需要子查询:

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

    【讨论】:

      【解决方案3】:

      这类作品:

      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 中得到了解决和解释,但对我来说似乎有点倒退:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-16
        • 1970-01-01
        • 2017-11-21
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        相关资源
        最近更新 更多