SQL Server从varchar出生日期计算年龄

时间:2014-02-10 01:30:05

标签: sql sql-server

存储过程提供@minAge@maxAge varchar值。

该表包含DOBvarchar,现在我需要选择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)

1 个答案:

答案 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

这可能不是最好的方法,但它应该有效。