用于从dob查询年龄范围的SQL语句

时间:2011-05-04 19:26:49

标签: sql range

问候。我有一张叫做“人”的桌子。它当然有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查询来列出dob中年龄范围内的所有人。我不知道怎么做这个查询请帮忙。

3 个答案:

答案 0 :(得分: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。您也可以使用临时表在其他数据库中完成相同的操作。

答案 1 :(得分:1)

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;

答案 2 :(得分:1)

有两种方法可以在没有临时表的情况下执行此操作。

一种是在你的位置重复计算

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