我有出生日期(2/3/1967),我想將其轉換爲今年的生日。在SQL中獲取當前的生日
select語句將返回這樣的事情
userid date_of_birth current_bday
abc123 2/3/1967 2/3/2011
我試圖用日期部分玩弄讓月份和日期,但沒有成功。
SQL Server 2008 R2的
我有出生日期(2/3/1967),我想將其轉換爲今年的生日。在SQL中獲取當前的生日
select語句將返回這樣的事情
userid date_of_birth current_bday
abc123 2/3/1967 2/3/2011
我試圖用日期部分玩弄讓月份和日期,但沒有成功。
SQL Server 2008 R2的
下面是做這件事:
使用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'
我認爲這是更簡潔:
SELECT userid
,date_of_birth
,DATEADD(YEAR,DATEDIFF(YEAR,date_of_birth,SYSDATETIME()),date_of_birth)
AS current_bday
如果你想抓住從今天的「下一個生日」(今年不只是,但可能明年如果生日是前一天,在這一年),你需要額外的檢查。
下面是其計算在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