圆形范围内的匹配日期

时间:2015-11-04 10:49:38

标签: sql date range modulus

我想弄清楚某人是否在某人生日的几周内发生了某件事。这一年并不重要;只有月和日。

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

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

如果活动和生日都在一年中的第4周和第48周之间,则效果很好。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用DATEDIFF功能:

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

请注意,此功能可能具有不同的名称(或参数),具体取决于DBMS。 例如,对于MySQL,DATEDIFF函数没有&#39;日期部分&#39;参数,所以你可以在this answer中做一些事情:

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