2015-11-04 69 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