2015-11-04 115 views
0

我想弄清楚某個事件是否在某人的生日的幾個星期內發生。這一年並不重要;只有月和日。圓形範圍內的匹配日期

例如,我想知道事件(1月5日)是否在生日(12月18日)的4周內。

在SQL中,我有 SELECT ..... where abs(week(event)-week(birthday))<5

這種運作良好,如果這兩個事件和生日是4周和在今年48之間。

我該如何設置查詢以便它在邊緣月份有效?

+0

你是什麼意思是邊緣月份? –

+0

我的意思是在一月份,本週將是1-4,而在十二月,本週將是48或更多。所以問題是如果你比較12月18日和1月5日,他們將分別在50周和2周。如果你做「abs(50-2)」,你會得到48,這看起來好像兩個日期相距超過3周。 – mankowitz

回答

1

在SQL Server中我會使用DATEDIFF%(模)。

SELECT 
... 
WHERE 
(ABS(DATEDIFF(day, @date1, @date2)) % 365) < 4*7 
OR 
(ABS(DATEDIFF(day, @date1, @date2)) % 365) > 365 - 4*7 

進行計算糾正即使@date1@date2在不同年閏年之間,我想這兩個日期移動到同一年。這取決於你使用的DBMS,如何更改日期的年份,但是一旦兩個日期都在同一年,模數就不需要了:

SELECT 
... 
WHERE 
ABS(DATEDIFF(day, @date1, @date2)) < 4*7 
OR 
ABS(DATEDIFF(day, @date1, @date2)) > 365 - 4*7 
0

可以使用功能DATEDIFF:這取決於DBMS

SELECT DATEDIFF(week,'2014-06-05','2015-08-05') AS DiffDateInWeeks 

注意,這個功能可能有不同的名稱(或參數)。 對於MySQL例如DATEDIFF函數沒有「日期部分」參數,所以你可以做這樣的事情在this answer

SELECT DATEDIFF('2014-06-05','2015-08-05')/7.0 AS DiffDateInWeeks