2014-02-26 87 views
1

我想搜索出生日期來自我的sql服務器數據庫表。問題我得到的是年DOB將有所不同,將比今年晚。如果我想獲取其生日將在未來7天內與Facebook生日提醒相同的客戶列表。如何使用sql查詢搜索birthdate?

我試圖smalldatetime轉換爲varchar和使用LIKE語句「_」 通配符。例如Convert(Char(10),DOB,103) LIKE "__/02/____'。但是,它給我列出了當月DOB即將到來的客戶。同時它還顯示了本月之前生日的數據。我只想要那些未來7天生日即將到來的數據。

我的應用程序開發於C#。如果可能的話使用DataTableDataView得到適當的結果,那麼請給我建議。

+0

可能重複的[SQL SELECT近期生日](http://stackoverflow.com/questions/83531/sql-select-upcoming-birthdays)檢查[本答案](http://stackoverflow.com/questions/83531/sql-select-upcoming-birthdays/83783#83783) – Damith

回答

2

使用this method of date assembly,這應該工作:

SELECT * 從客戶那裏 DATEADD(日,DAY(DOB)-1, DATEADD(月,MONTH(DOB) - 1, DATEADD(一年,YEAR(CURRENT_TIMESTAMP) - 1900,0))) CURRENT_TIMESTAMP和DATEADD之間(DD,7,CURRENT_TIMESTAMP);

編輯
以上不適用於整個年份的變化。 這個呢,雖然是相當笨拙(使用@Today測試場景,然後代替CURRENT_TIMESTAMP完成時):

DECLARE @Today DATE = '31 Dec 2013'; 
select * 
from Customers 
CROSS JOIN 
    (
     SELECT YEAR(@Today) AS yr 
     UNION 
     SELECT YEAR(DATEADD(d, 7, @Today)) 
    ) years 
where 
    DATEADD(day, DAY(DOB) -1, 
      DATEADD(month, MONTH(DOB) - 1, 
       DATEADD(year, years.yr - 1900, 0))) 
    BETWEEN @Today AND DATEADD(DD, 7, @Today); 

SqlFiddle here

cross join將今年或在今年和明年,如果返回我們已經接近年底了,如果年份相同,UNION將確保只有一行。如果兩年退還(即我們在十二月底),那麼Between將排除今年1月份發生的客戶的DOB:P必須有更優雅的解決方案,但是...

+0

爲什麼不只是將DOB和今天之間的差異加入到DOB中,並按照我的答案中發佈的內容進行匹配?我以前使用過這種方法無數次,它始終工作100%... – FarligOpptreden

0

使用基於日期的函數。

//pseudo code 
Where Month(birthdate) = 7 
and Day(birthdate) = 4 

將拉動那些生於七月

+0

這不解決OP,而是匹配日期到特定的日期和月份。這個想法是在今天和今天之間的7天之間獲得日期,所以你不能將它匹配到特定的日子和/或月份。 – FarligOpptreden

0

我不是我的開發機器上,所以這是未經測試的第四,但應該指向你在正確的方向。

SELECT * 
FROM TABLE 
WHERE MONTH(DOB) = MONTH(GETDATE()) AND 
(DAY(DOB) BETWEEN DAY(GETDATE()) AND 
DAY(DATEADD(dd, 7, GETDATE()))) 

注意,GETDATE()函數獲取該計算機上當前時區的當前日期和時間。要使用UTC日期,請將GETDATE()替換爲GETUTCDATE()

+1

這是行不通的,因爲一旦跨越兩個月,你就不會得到正確的數據。 – FarligOpptreden

+0

@FarligOpptreden好點。我沒有考慮...... – HTX9

1

嘗試使用DATEPARTDATEADDDATEDIFF函數爲您的查詢創建where子句。 WHERE子句中應該得到你想要的結果如下:

SELECT * 
FROM [Table] 
WHERE DATEADD(yy, DATEDIFF(yy, [DOB], GETDATE()) + 
      CASE 
       WHEN DATEPART(mm, GETDATE()) > 
        DATEPART(mm, DATEADD(dd, 7, GETDATE())) 
       AND DATEPART(mm, GETDATE()) <> DATEPART(mm, [DOB]) 
        THEN 1 
       ELSE 0 
      END, [DOB]) 
     BETWEEN GETDATE() AND DATEADD(dd, 7, GETDATE()) 

that從句做什麼,是移動[DOB]值使用DATEADDDATEDIFF當年,從今天今天和7天之間進行匹配。

編輯:修改了條款以適應週期在一年的時間段。

+0

這似乎也錯過了今天是12月31日的邊緣情況,並且在1月的第一個星期有一個顧客的生日即將到來? [SqlFiddle](http://www.sqlfiddle.com/#!6/c6675/1)(小提琴更新) – StuartLC

+0

使http://www.sqlfiddle.com/#!6/16105/1 – StuartLC

+0

忙於修改後的答案 - 只是經過測試,你是對的。 – FarligOpptreden

0

使用StuartLC的示例作爲基準。如何爲每條記錄創建DOB,而不是實際的年份,使用當年和明年。通過這種方式,您可以在兩個日期中將DateDiff作爲七天範圍 - 處理年度滾動並對其意圖非常明確。

實施例:

DECLARE @Today DATE = '31 Dec 2013'; 

SELECT * 
FROM Customers 
WHERE 
     cast(
      cast(Month(DOB) AS varchar) + '/' + 
      cast(Day(DOB) AS varchar) + '/' + 
      cast(Year(@Today) AS varchar) AS Date) BETWEEN @Today AND dateadd(day, 7, @Today) 
OR 
     cast(
      cast(Month(DOB) AS varchar) + '/' + 
      cast(Day(DOB) AS varchar) + '/' + 
      cast(Year(@Today) + 1 AS varchar) AS Date) BETWEEN @Today AND dateadd(day, 7, @Today) 

Sql Fiddle here