我有一个表,上面列出了人们的出生日期(目前是nvarchar(25))

我如何将其转换为日期,然后以年为单位计算他们的年龄?

我的数据如下所示

ID    Name   DOB
1     John   1992-01-09 00:00:00
2     Sally  1959-05-20 00:00:00

我希望看到:

ID    Name   AGE  DOB
1     John   17   1992-01-09 00:00:00
2     Sally  50   1959-05-20 00:00:00

当前回答

下面的脚本检查现在和给定出生日期之间的年差;第二部分检查该生日在当年是否已经过去;如果不是,则减去:

SELECT year(NOW()) - year(date_of_birth) - (CONCAT(year(NOW()), '-', month(date_of_birth), '-', day(date_of_birth)) > NOW()) AS Age
FROM tableName;

其他回答

我相信这是类似于其他张贴在这里....但是这个解决方案适用于闰年1976年2月29日至2011年3月1日的例子,也适用于第一年的情况。比如2011年4月7日到2012年3月7日,上一个关于闰年解决方案的帖子在第一年的用例中不适用。

SELECT FLOOR(DATEDIFF(DAY, @date1 , @date2) / 365.25)

在这里找到。

您需要考虑datediff命令的查房方式。

SELECT CASE WHEN dateadd(year, datediff (year, DOB, getdate()), DOB) > getdate()
            THEN datediff(year, DOB, getdate()) - 1
            ELSE datediff(year, DOB, getdate())
       END as Age
FROM <table>

我从这里改编的。

请注意,对于非闰年,将把2月28日视为闰年的生日,例如,2020年2月29日出生的人将被视为2021年2月28日的1岁生日,而不是2021年3月1日。

DECLARE @FromDate DATETIME = '1992-01-2623:59:59.000', 
        @ToDate   DATETIME = '2016-08-10 00:00:00.000',
        @Years INT, @Months INT, @Days INT, @tmpFromDate DATETIME
SET @Years = DATEDIFF(YEAR, @FromDate, @ToDate)
 - (CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, @FromDate, @ToDate),
          @FromDate) > @ToDate THEN 1 ELSE 0 END) 


SET @tmpFromDate = DATEADD(YEAR, @Years , @FromDate)
SET @Months =  DATEDIFF(MONTH, @tmpFromDate, @ToDate)
 - (CASE WHEN DATEADD(MONTH,DATEDIFF(MONTH, @tmpFromDate, @ToDate),
          @tmpFromDate) > @ToDate THEN 1 ELSE 0 END) 

SET @tmpFromDate = DATEADD(MONTH, @Months , @tmpFromDate)
SET @Days =  DATEDIFF(DAY, @tmpFromDate, @ToDate)
 - (CASE WHEN DATEADD(DAY, DATEDIFF(DAY, @tmpFromDate, @ToDate),
          @tmpFromDate) > @ToDate THEN 1 ELSE 0 END) 

SELECT @FromDate FromDate, @ToDate ToDate, 
       @Years Years,  @Months Months, @Days Days

这个问题有很多答案,但我认为这一个更接近事实。

我们都知道,datediff(year,…,…)函数只计算日期部分跨越的边界,在本例中是年份。因此,它忽略了一年中的其他时间。

只有当年份从生日开始时,才会给出以完整年份为单位的年龄。它可能不会,但我们可以通过将请求日期调整相同的金额来假装它。

在伪伪代码中,它是这样的:

adjusted_today = today - month(dob) + 1 - day(dob) + 1
age = year(adjusted_today - dob)

+ 1是考虑到月和日数字从1开始,而不是0。 我们把月份和日期分开减去,而不是减去一年中的某一天,是因为二月的长度有令人讨厌的变化趋势。

SQL中的计算是:

datediff(year,dob,dateadd(month,-month(dob)+1,dateadd(day,-day(dob)+1,today)))

dob和today被推定为出生日期和求婚日期。

你可以这样测试:

WITH dates AS (
    SELECT
        cast('2022-03-01' as date) AS today,
        cast('1943-02-25' as date) AS dob
)
select
    datediff(year,dob,dateadd(month,-month(dob)+1,dateadd(day,-day(dob)+1,today))) AS age
from dates;

这是乔治·哈里森的完整年龄。

这比摆弄四分之一日要简洁得多,后者通常会在边缘处给出误导性的值。

如果你有机会创建一个标量函数,你可以使用这样的东西:

DROP FUNCTION IF EXISTS age;
GO
CREATE FUNCTION age(@dob date, @today date) RETURNS INT AS
BEGIN
    SET @today = dateadd(month,-month(@dob)+1,@today);
    SET @today = dateadd(day,-day(@dob)+1,@today);
    RETURN datediff(year,@dob,@today);
END;
GO

请记住,您需要调用dbo.age(),因为Microsoft。

以下是我如何计算年龄给出出生日期和当前日期。

select case 
            when cast(getdate() as date) = cast(dateadd(year, (datediff(year, '1996-09-09', getdate())), '1996-09-09') as date)
                then dateDiff(yyyy,'1996-09-09',dateadd(year, 0, getdate()))
            else dateDiff(yyyy,'1996-09-09',dateadd(year, -1, getdate()))
        end as MemberAge
go