我想弄清楚某個事件是否在某人的生日的幾個星期內發生。這一年並不重要;只有月和日。圓形範圍內的匹配日期
例如,我想知道事件(1月5日)是否在生日(12月18日)的4周內。
在SQL中,我有 SELECT ..... where abs(week(event)-week(birthday))<5
這種運作良好,如果這兩個事件和生日是4周和在今年48之間。
我該如何設置查詢以便它在邊緣月份有效?
我想弄清楚某個事件是否在某人的生日的幾個星期內發生。這一年並不重要;只有月和日。圓形範圍內的匹配日期
例如,我想知道事件(1月5日)是否在生日(12月18日)的4周內。
在SQL中,我有 SELECT ..... where abs(week(event)-week(birthday))<5
這種運作良好,如果這兩個事件和生日是4周和在今年48之間。
我該如何設置查詢以便它在邊緣月份有效?
在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
可以使用功能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
你是什麼意思是邊緣月份? –
我的意思是在一月份,本週將是1-4,而在十二月,本週將是48或更多。所以問題是如果你比較12月18日和1月5日,他們將分別在50周和2周。如果你做「abs(50-2)」,你會得到48,這看起來好像兩個日期相距超過3周。 – mankowitz