【问题标题】:SQL Statement for querying an age range from a dob从 dob 查询年龄范围的 SQL 语句
【发布时间】:2014-01-06 05:07:48
【问题描述】:

您好。我有一张叫做“人”的桌子。它当然将 dob 作为日期数据类型。我用以下语句计算年龄:

SELECT DATE_FORMAT( NOW( ) ,  '%Y' ) - DATE_FORMAT( fecha_nac,  '%Y' ) - 
( DATE_FORMAT(NOW( ) ,  '00-%m-%d' ) < DATE_FORMAT( fecha_nac,  '00-%m-%d' ) ) 
AS edad

但是当我尝试使用以下语句查询特定年龄时,它给了我错误:

SELECT DATE_FORMAT( NOW( ) ,  '%Y' ) - DATE_FORMAT( fecha_nac,  '%Y' ) - 
( DATE_FORMAT( NOW( ) ,  '00-%m-%d' ) < DATE_FORMAT( fecha_nac,  '00-%m-%d' ) ) 
AS edad WHERE edad BETWEEN 1 AND 50

当然它给了我错误,因为“edad”列不存在。我需要一个 sql 查询来列出一个年龄范围内的所有人。我不知道如何进行此查询,请帮忙。

【问题讨论】:

  • 对于其他可能会尝试提供帮助的人,我只想指出 fecha_nac 表示 birth_dateedadage
  • 你使用的是哪个数据库?

标签: sql range


【解决方案1】:
    WITH TBL AS
    (
    SELECT DATE_FORMAT( NOW( ) ,  '%Y' ) - DATE_FORMAT( fecha_nac,  '%Y' ) - ( DATE_FORMAT( NOW( ) ,  '00-%m-%d' ) < DATE_FORMAT( fecha_nac,  '00-%m-%d' ) ) AS edad
FROM Persons
    )

    SELECT Edad FROM TBL WHERE Edad BETWEEN 1 AND 50

以上是SQL Server。您也可以使用临时表在其他数据库中完成相同的操作。

【讨论】:

  • 感谢您的信息。我将搜索临时表
  • 以上肯定不是SQL Server。那里没有DATE_FORMAT 函数或NOW
【解决方案2】:

MySQL 不允许 WITH 构造。如果您需要的只是人们,而不是他们目前的确切年龄,您可以将测试移到 WHERE 子句中。

SELECT nombre, otras_cosas FROM personas 
WHERE NOW() 
 BETWEEN (CAST(fecha_nac) AS DATETIME) + INTERVAL 1 YEAR
   AND (CAST(fecha_nac) AS DATETIME) + INTERVAL 50 YEAR;

【讨论】:

    【解决方案3】:

    在没有临时表的情况下,有两种方法可以做到这一点。

    一种是在你的where重复计算

    SELECT yourtable.nombre, yourtable.otras_cosas,
          Date_format(Now(), '%Y') - Date_format(fecha_nac, '%Y') - ( 
                  Date_format(Now(), '00-%m-%d') < Date_format(fecha_nac, '00-%m-%d' 
                                                   ) ) AS 
           edad 
    FROM   yourtable 
    WHERE  Date_format(Now(), '%Y') - Date_format(fecha_nac, '%Y') - ( 
                  Date_format(Now(), '00-%m-%d') < Date_format(fecha_nac, '00-%m-%d' 
                                                   ) ) BETWEEN 1 AND 50 
    

    另一种是使用内联视图

    SELECT   t.nombre, t.otras_cosas, t.edad 
    FROM   (SELECT  nombre, otras_cosas, Date_format(Now(), '%Y') - Date_format(fecha_nac, '%Y') - ( 
                                  Date_format(Now(), '00-%m-%d') < 
                                  Date_format(fecha_nac, '00-%m-%d') ) AS edad 
            FROM   yourtable) t 
    WHERE  t.edad BETWEEN 1 AND 50 
    

    【讨论】:

    • 内联视图版本不错,但您可能需要在SELECT 中添加名称或id 字段以及年龄。此外,计算对于存储过程也是一个不错的选择。
    • @Andrew Lazarus 好点。我添加了一些额外的假设字段(无耻地从你的答案中窃取)以更好地展示发生了什么
    • 不错的答案。我将使用第二个查询。非常感谢大家的帮助。
    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多