我有出生日期(19/3/3/67),我希望将其转换为今年的生日。
select语句会返回类似这样的内容
userid date_of_birth current_bday
abc123 2/3/1967 2/3/2011
我尝试使用datepart来获取月份和日期,但没有成功。
SQL Server 2008 R2
答案 0 :(得分:4)
这是一种方法:
使用DATEADD功能添加(以年为单位)当前年份与出生年份(出生日期)之间的差异
SELECT userid,
date_of_birth,
DATEADD(YY, DATEPART(YYYY, GETDATE()) - DATEPART(YYYY,date_of_birth), date_of_birth) AS current_bday
FROM Users
要担心的一件事是尝试按当月的个人月份和日期创建日期。与此相关的一个问题是试图在一年不是闰年的情况下创建2月29日的生日。我测试了这个,看来你需要专门考虑这个,因为DATEADD函数为'2000-02-29'的出生日期提供了'2011-02-28'的日期
答案 1 :(得分:2)
我认为这更加整洁:
SELECT userid
,date_of_birth
,DATEADD(YEAR,DATEDIFF(YEAR,date_of_birth,SYSDATETIME()),date_of_birth)
AS current_bday
答案 2 :(得分:0)
如果你想抓住下一个生日"从今天开始(不仅仅是今年,但可能明年如果生日是在今天之前,今年),你需要额外的检查。
这是一个例子,它以两种方式计算1988年每个月的第29天的下一个生日: - 不检查bday是否已经过去(bday) - 检查bday是否已经过去(bday2)
with dobs (dob) as (
select convert(datetime,dob)
from (values
('1988-01-29')
, ('1988-02-29')
, ('1988-03-29')
, ('1988-04-29')
, ('1988-05-29')
, ('1988-06-29')
, ('1988-07-29')
, ('1988-08-29')
, ('1988-09-29')
, ('1988-10-29')
, ('1988-11-29')
, ('1988-12-29')
) as X(dob)
)
select
dob,
dateadd(YY, datepart(YYYY, getdate()) - datepart(YYYY,dob), dob) as bday1
, case when
datepart(month, dateadd(year,datediff(year,dob,getdate()),dob))
<
datepart(month, getdate())
or ( datepart(month, dateadd(year,datediff(year,dob,getdate()),dob))
<
datepart(month, getdate())
and
datepart(day, dateadd(year,datediff(month,dob,getdate()),dob))
<
datepart(day, getdate())
)
then dateadd(year,1+datediff(year,dob,getdate()),dob)
else dateadd(year,datediff(year,dob,getdate()),dob)
end as bday2
from dobs