存储过程提供@minAge
和@maxAge
varchar
值。
该表包含DOB
列varchar
,现在我需要选择DOB
(年龄)介于最小和最大年龄之间的行。
例如@minAge = 12
和@maxAge = 40
,我们必须先将DOB
字符串转换为当前年龄,然后才选择介于12和40之间(包括)的行。 / p>
我有以下代码,但会产生错误
SELECT *
FROM tableName
WHERE
FLOOR((CAST(GetDate() AS INTEGER) - CAST(DOB AS INTEGER)) / 365.25) AS Age
BETWEEN CAST(@minage AS INT) AND CAST(@maxAge AS INT)
答案 0 :(得分:2)
计算年龄的一种方法是:
DATEDIFF(YY, CAST(dob AS DATETIME), GETDATE()) - CASE WHEN( (MONTH(CAST(dob AS DATETIME))*100 + DAY(CAST(dob AS DATETIME))) > (MONTH(GETDATE())*100 + DAY(GETDATE())) ) THEN 1 ELSE 0 END AS Age
其中dob
是以varchar形式存储的出生日期(以可以投射到日期时间的方式)。
一个例子:
declare @people table(name varchar(20), dob varchar(10))
insert @people values ('adam', '1970-01-01')
insert @people values ('burt', '2002-01-13')
insert @people values ('dave', '1992-11-13')
insert @people values ('eric', '1973-11-13')
SELECT
name,
DATEDIFF(YY, CAST(dob AS DATETIME), GETDATE()) - CASE WHEN( (MONTH(dob)*100 + DAY(dob)) > (MONTH(GETDATE())*100 + DAY(GETDATE())) ) THEN 1 ELSE 0 END AS Age
FROM @people
WHERE DATEDIFF(YY, dob, GETDATE()) - CASE WHEN( (MONTH(dob)*100 + DAY(dob)) > (MONTH(GETDATE())*100 + DAY(GETDATE())) ) THEN 1 ELSE 0 END
BETWEEN 12 AND 40
这将是结果:
name Age
burt 12
dave 21
eric 40
这可能不是最好的方法,但它应该有效。