我想弄清楚某个事件是否在某人的生日的几个星期内发生。这一年并不重要;只有月和日。圆形范围内的匹配日期
例如,我想知道事件(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