在SQL中获取当年的生日

时间:2011-07-14 16:00:46

标签: sql-server

我有出生日期(19/3/3/67),我希望将其转换为今年的生日。

select语句会返回类似这样的内容

userid   date_of_birth  current_bday
abc123    2/3/1967       2/3/2011

我尝试使用datepart来获取月份和日期,但没有成功。

SQL Server 2008 R2

3 个答案:

答案 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