2011-07-14 64 views
1

我有出生日期(2/3/1967),我想將其轉換爲今年的生日。在SQL中獲取當前的生日

select語句將返回這樣的事情

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

我試圖用日期部分玩弄讓月份和日期,但沒有成功。

SQL Server 2008 R2的

回答

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函數給出的日期'2011-02-28'的出生日期'2000-02-29'

2

我認爲這是更簡潔:

SELECT userid 
     ,date_of_birth 
     ,DATEADD(YEAR,DATEDIFF(YEAR,date_of_birth,SYSDATETIME()),date_of_birth) 
     AS current_bday 
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