MySQL查询WHERE日期,以间隔天数表示

b5buobof  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(190)

我有一个带有邀请的表,我想查询今天x天间隔内的所有邀请。例如,90天,我想要90天前创建的每个邀请,180天前和270天前等等。

然后,对于每个间隔时段,我想在两边添加一些x天数的回旋余地,例如2,所以现在是在88到92天前、178到182天前和268到272天前之间创建的邀请,等等。

我对此的查询开始如下:

SET @days_span = 90;
SET @days_variance = 2;

SELECT
  invites.id,
  invites.date_created_utc
FROM
  invites
WHERE
  -- between 88 and 92 days ago
  invites.date_created_utc BETWEEN date_sub(utc_timestamp(), interval (@days_span + @days_variance) DAY) AND date_sub(utc_timestamp(), interval (@days_span - @days_variance) DAY)
  -- between 178 and 182 days ago
  OR invites.date_created_utc BETWEEN date_sub(utc_timestamp(), interval (@days_span * 2 + @days_variance) DAY) AND date_sub(utc_timestamp(), interval (@days_span * 2 - @days_variance) DAY)
  -- between 268 and 272 days ago
  OR invites.date_created_utc BETWEEN date_sub(utc_timestamp(), interval (@days_span * 3 + @days_variance) DAY) AND date_sub(utc_timestamp(), interval (@days_span * 3 - @days_variance) DAY);
  -- etc.

为此,我通过手动重复where子句并乘以日期间隔跨度来作弊。现在我不知道如何将它扩展到n个区间。

我已经使用一个临时表和一些测试数据填充了一个dbfiddle:https://dbfiddle.uk/XSE5iIEN

tp5buhyn

tp5buhyn1#

获取日期差,然后使用MOD运算符查看它与@days_span的距离有多近。

SET @days_span = 90;
SET @days_variance = 2;
SET @days_high_mod = @days_span - @days_variance; 

SELECT id, date_created_utc
FROM invites
WHERE DATEDIFF(utc_timestamp(), date_created_utc) MOD @days_span <= @days_variance 
   OR DATEDIFF(utc_timestamp(), date_created_utc) MOD @days_span >= @days_high_mod

您需要进行两次比较,因为MOD将始终返回正数。因此,如果距离下一个间隔开始还有2天,则模数将为88。这就是@days_high_mod的用途。

相关问题