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