在循环范围内匹配日期

matching date in circular range

我想弄清楚某个事件是否发生在某人生日的几周内。年份无关紧要;只有月份和日期。

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

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

如果事件和生日都在一年中的第 4 周到第 48 周之间,则此方法效果很好。

如何设置查询以使其适用于边缘月份?

您可以使用函数 DATEDIFF:

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

请注意,此函数可能具有不同的名称(或参数),具体取决于 DBMS。 对于 MySQL 例如 DATEDIFF function has no 'date part' parameter, so you could do something like in this answer:

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

在 SQL 服务器中,我将使用 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