这个问题有很多答案,但我认为这一个更接近事实。
我们都知道,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。