2010-09-20 76 views
5

這一個已經給我一段時間了。最近幾年前,當我重新訪問一些我爲客戶寫的代碼時,我懷疑是否有更優雅的解決方案來解決這個問題。SQL Server 2005,計算從出生日期即將到來的生日

客戶存儲所有的客戶信息,包括出生日期(日期時間字段)

的日期,他們運行的每個星期一檢索任何客戶的生日會落在接下來的一週內的提取物。

I.e.如果摘錄是在1月1日星期一運行的,則會在1月8日星期一 - > 1月14日星期日之間(包括)生日的客戶被檢索。

我的解決方案是使用Datepart(dy)函數計算所有即將到來的生日,其基於客戶出生日期轉換爲年份,並添加一些邏輯以包括在一年結束時運行的提取。 問題在於,如果客戶出生在閏年和/或提取物在2月29日之後的閏年運行,​​那麼使用Day of year會將結果推遲1天,因此我必須再次添加更多邏輯,以便程序返回預期的結果。

對於簡單的任務來說,這看起來相當過分。 爲了簡單起見,假設表'customer'包含4個字段,名字,姓氏,dob和地址。

如何簡化這個任何建議將真正理解

韋斯

回答

4

會這樣的工作嗎?

select * from Customers c 
where dateadd(year, 1900-year(dob), dob) 
    between dateadd(year, 1900-year(getdate()), getdate()) 
    and dateadd(year, 1900-year(getdate()), getdate())+7 
+1

當然!我現在明白了。非常感謝你的解釋。這似乎很明顯,現在我明白它是如何工作的!一旦你陷入了以相同的方式看待事物,雖然你錯過了明顯的。非常感謝。 – 2010-09-20 13:36:00

+1

哦,來吧,這是SO的力量!你知道,集思廣益的事情。 – 2010-09-20 13:38:58

+0

我在30天內使用這種方法,發現一年中的這個時候(12月15日)都不起作用。看看這裏的答案:http://stackoverflow.com/questions/83531/sql-select-upcoming-birthdays – Warren 2015-12-15 04:49:03

3

爲什麼不在今年的生日使用DATEPART(周)?

SET DATEFIRST 1 -- Set first day of week to monday 
SELECT * FROM customer 
WHERE DATEPART(wk, DATEADD(yy, DATEPART(yy, GETDATE()) - DATEPART(yy, customer.dob), customer.dob)) = DATEPART(wk, GETDATE()) + 1 

它選擇所有生日週數大於當前週數的客戶。

+0

我喜歡這個解決方案......但是,如果我們不從週一開始什麼了,但是從週四。哦,我明白了...... :) – 2010-09-20 13:34:21

+1

1.根據MS'SETDATE FIRST 1',星期日不是星期一 – Unreason 2010-09-20 13:34:58

+2

@不理由:不,星期一。請參閱http://msdn.microsoft.com/en-us/library/ms181598.aspx – Carvellis 2010-09-20 13:36:54

2

我認爲DATEADD應該做正確的事情。

+0

我不明白你將如何使用DateAdd。客戶DOB的不同..即04/01/1965,02/06/1982等等。 – 2010-09-20 13:29:56

+0

@Wes Price,請參閱我的答案。 – 2010-09-20 13:30:36

1
YEAR(GETDATE() - dbo.Patients.Dob) - 1900 

我可以放心地假設你從未有過的1900

+3

[你可以](http://en.wikipedia.org/wiki/Oldest_people#Ten_verified_oldest_people_living)? – fredley 2011-10-14 10:50:12

+0

我知道這個帖子很老,但我同意湯姆。 – RoLYroLLs 2013-06-28 18:28:35

1

生於請嘗試這一個客戶。

SELECT TOP 10 BirthDate, FirstName 
FROM Customers 
WHERE DATEPART(mm,BirthDate) >= DATEPART(mm,GETDATE()) 
AND DATEPART(day,BirthDate) >= DATEPART(day,getdate()) 
OR DATEPART(mm,BirthDate) > DATEPART(mm,getdate()) 
ORDER BY DatePart(mm,BirthDate),DatePart(day,BirthDate) 

此查詢將獲得即將到來的生日,包括今天本身