gpt4 book ai didi

sql-server - 计算年龄的函数

转载 作者:行者123 更新时间:2023-12-02 16:27:43 31 4
gpt4 key购买 nike

我正在尝试编写一个函数,可以根据插入记录的日期而不是 getdate() 来查找年龄。我想过滤注册时小于18岁的用户。如果我在一年后查询它,根据记录插入日期而不是当前日期,它仍应将用户显示为 17。这是我写的,但它仍然根据当前日期而不是记录插入日期给出年龄。任何建议都会非常有帮助。谢谢您

--InputDate as DateOfBirth
--InsertDate as date the record was inserted

CREATE FUNCTION [dbo].[FindAge] (@InputDate int, @Insertdate datetime )
RETURNS int
AS
BEGIN
DECLARE @Age as Int

DECLARE @d DATETIME
SET @d = CONVERT(DATETIME, CONVERT(VARCHAR(8), @InputDate), 112)

SELECT @Age=DATEDIFF(year, @d, @Insertdate)
- CASE WHEN DATEADD(year, DATEDIFF(year, @d, @Insertdate), @d) <= GetDate()
THEN 0 ELSE 1 END

RETURN @Age
END

---- Drop Obselete procs
GO

更新遵循培根位的建议,效果非常好。

最佳答案

所有DATEDIFF() 所做的就是从日期部分中减去年份。这非常愚蠢:

select datediff(yy,'2000-12-19','2014-01-01') --14
select datediff(yy,'2000-12-19','2014-12-18') --14
select datediff(yy,'2000-12-19','2014-12-19') --14
select datediff(yy,'2000-12-19','2014-12-20') --14
select datediff(yy,'2000-12-19','2014-12-31') --14
select datediff(yy,'2000-12-19','2015-01-01') --15
select datediff(yy,'2000-12-19','2015-12-31') --15
select datediff(yy,'2000-12-19','2016-01-01') --16
select datediff(yy,'2000-12-19','2016-12-31') --16

不要计算一年有 365.25 天之类的小时数。这是徒劳的练习,并且只能保证在每个人的生日附近你都会出错。

你最好的选择是计算人类是如何做的。在美国(我相信也是大多数西方国家),这是年份之间的差异,但您只在过了生日时才计算当前年份:

declare @birthdate date = '2000-12-19';

declare @target date;

SELECT DATEDIFF(yy, @birthdate, @target)
- CASE
WHEN (MONTH(@birthdate) > MONTH(@target))
OR (
MONTH(@birthdate) = MONTH(@target)
AND DAY(@birthdate) > DAY(@target)
)
THEN 1
ELSE 0
END

这是您将获得的值:

set @target = '2014-01-01' --13
set @target = '2014-12-18' --13
set @target = '2014-12-19' --14
set @target = '2014-12-20' --14
set @target = '2014-12-31' --14
set @target = '2015-01-01' --14
set @target = '2015-12-31' --15
set @target = '2016-01-01' --15
set @target = '2016-12-31' --16

@target 更改为 getdate() 以计算目前的年龄。

如果您所在的地区使用 East Asian age reckoning但是,您需要使用完全不同的方法来确定一个人的年龄,因为他们在出生之日被视为 1 岁,并且他们的年龄每年二月都会增加。

关于sql-server - 计算年龄的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27574036/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com