在 SQL 中查找某人的年龄

Posted

技术标签:

【中文标题】在 SQL 中查找某人的年龄【英文标题】:Finding someone's age in SQL 【发布时间】:2008-11-12 12:15:37 【问题描述】:

在 SQL Server 数据库中,我记录人们的出生日期。是否有一种直接的方法可以仅使用 SQL 计算出该人在给定日期的年龄?

使用 DATEDIFF(YEAR, DateOfBirth, GETDATE()) 不起作用,因为这只查看日期的年份部分。例如 DATEDIFF(YEAR, '31 December 2007', '01 January 2008') 返回 1。

【问题讨论】:

【参考方案1】:

查看这篇文章:How to calculate age of a person using SQL codes

这是文章中的代码:

DECLARE @BirthDate DATETIME
DECLARE @CurrentDate DATETIME

SELECT @CurrentDate = '20070210', @BirthDate = '19790519'

SELECT DATEDIFF(YY, @BirthDate, @CurrentDate) - CASE WHEN( (MONTH(@BirthDate)*100 + DAY(@BirthDate)) > (MONTH(@CurrentDate)*100 + DAY(@CurrentDate)) ) THEN 1 ELSE 0 END 

【讨论】:

您真的可以将相关代码放入您的答案中吗?指向其他网站的链接可能(并且确实)中断,因此如果该链接不再有效,那么将来此答案可能无用。 @Tim C +1 建议添加代码,因为该网站当前已关闭,并且仅使用链接此答案将毫无用处。【参考方案2】:

还有一种更简单的方法:

Select CAST(DATEDIFF(hh, [birthdate], GETDATE()) / 8766 AS int) AS Age

因为这里的舍入非常精细,所以这几乎完全准确。例外是如此令人费解,以至于它们几乎是幽默的:如果我们 A) 要求在早上 6:00 之前的年龄,B) 在这个人的生日和 C) 他们的生日在之后2 月 28 日。在我的环境中,这是一个完全可以接受的折衷方案。

【讨论】:

如果您将 GETDATE() 替换为静态值,您将更频繁地遇到异常,因为您在午夜进行检查。看起来从中午而不是午夜开始检查会起作用。【参考方案3】:

FWIW,年龄可以以直接的方式计算,无需借助 hack(并不是说 hack 有什么问题!):

CREATE FUNCTION Age (@BirthDate DATETIME)
RETURNS INT
AS
BEGIN
    DECLARE @AgeOnBirthdayThisYear INT
    DECLARE @BirthdayThisYear DATETIME
    SET @AgeOnBirthdayThisYear = DATEDIFF(year, @BirthDate, GETDATE())
    SET @BirthdayThisYear = DATEADD(year, @AgeOnBirthdayThisYear, @BirthDate)
    RETURN
        @AgeOnBirthdayThisYear
        - CASE WHEN @BirthdayThisYear > GETDATE() THEN 1 ELSE 0 END
END

【讨论】:

【参考方案4】:

这个解决方案展示了如何在一个没有变量的查询中

SELECT DATEDIFF(YY, birthdate, GETDATE()) - CASE WHEN( (MONTH(birthdate)*100 + DAY(birthdate)) > (MONTH(GETDATE())*100 + DAY(GETDATE())) ) THEN 1 ELSE 0 END

【讨论】:

【参考方案5】:

这比提供的答案更简洁、速度更快,而且完全准确:

datediff(year,DateOfBirth,getdate()-datepart(dy,DateOfBirth)+1)

【讨论】:

GetDate() 为生日时,此方法无效。这是一个例子,这个人应该是 40 岁,但它只返回 39。SELECT datediff(year,'1/29/1973',CAST('1/29/2013' AS DATETIME)-datepart(dy,'1/29/1973'))【参考方案6】:

如果您接受闰婴儿在连续 2 月 29 日或非闰年的 3 月 1 日大一岁的算法,我希望这个是完美的。 @DOB 必须包含距现在几个世纪之内的日期,@AsOf 必须包含相似的日期 >= @DOB:

SET @Age = YEAR(@AsOf) - YEAR(@DOB) - 1
IF MONTH(@AsOf) * 100 + DAY(@AsOf) >= MONTH(@DOB) * 100 + DAY(@DOB)
    SET @Age = @Age + 1

我真的非常感谢任何测试和 cmets,因为我还没有找到破解它的方法......但是。

添加 - 2014 年 1 月 31 日:这个似乎也很完美,尽管乍一看它看起来太粗糙了:

SET @Age = FLOOR(DATEDIFF(dd,@DOB,@CompareDate)/365.25)

将这些弹出一个函数,这是一个测试脚本:

    SELECT dbo.fnGetAge('2/27/2008', '2/27/2012')
    SELECT dbo.fnGetAge('2/27/2008', '2/28/2012')
    SELECT dbo.fnGetAge('2/27/2008', '2/29/2012')
    SELECT dbo.fnGetAge('2/27/2008', '3/1/2012')
    -- 4 4 4 4
    SELECT dbo.fnGetAge('2/28/2008', '2/27/2012')
    SELECT dbo.fnGetAge('2/28/2008', '2/28/2012')
    SELECT dbo.fnGetAge('2/28/2008', '2/29/2012')
    SELECT dbo.fnGetAge('2/28/2008', '3/1/2012')
    -- 3 4 4 4
    SELECT dbo.fnGetAge('2/29/2008', '2/27/2012')
    SELECT dbo.fnGetAge('2/29/2008', '2/28/2012')
    SELECT dbo.fnGetAge('2/29/2008', '2/29/2012')
    SELECT dbo.fnGetAge('2/29/2008', '3/1/2012')
    -- 3 3 4 4
    SELECT dbo.fnGetAge('3/1/2008', '2/27/2012')
    SELECT dbo.fnGetAge('3/1/2008', '2/28/2012')
    SELECT dbo.fnGetAge('3/1/2008', '2/29/2012')
    SELECT dbo.fnGetAge('3/1/2008', '3/1/2012')
    -- 3 3 3 4
    SELECT dbo.fnGetAge('3/1/2007', '2/27/2012')
    SELECT dbo.fnGetAge('3/1/2007', '2/28/2012')
    SELECT dbo.fnGetAge('3/1/2007', '2/29/2012')
    SELECT dbo.fnGetAge('3/1/2007', '3/1/2012')
    -- 4 4 4 5
    SELECT dbo.fnGetAge('3/1/2007', '2/27/2013')
    SELECT dbo.fnGetAge('3/1/2007', '2/28/2013')
    SELECT dbo.fnGetAge('3/1/2007', '3/1/2013')
    SELECT dbo.fnGetAge('2/27/2007', '2/28/2013')
    SELECT dbo.fnGetAge('2/28/2007', '2/28/2014')
    -- 5 5 6 6 7

干杯

PS:你可以将 2 月 29 日的决定调整为提前一天,如果这让你觉得很合适的话。

【讨论】:

【参考方案7】:
SELECT Pname, DOB, DATEDIFF(YEAR, DOB, GETDATE()) AS Age
FROM tablename

【讨论】:

一点解释可以大有帮助

以上是关于在 SQL 中查找某人的年龄的主要内容,如果未能解决你的问题,请参考以下文章

若要在stu表中查找所有姓“李”且年龄在30~40岁之间的记录,所用SQL语句的命令是 ( )

SQL 中怎么根据出生日期算出年龄 然后用年龄查询

准确的年龄计算[重复]

如何写在身份证号码中提取年龄的sql语句

如何写在身份证号码中提取年龄的sql语句

在SQL语言中,输入的是出生年月,如何获取年龄。