我有一个带有邀请的表,我想查询今天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
1条答案
按热度按时间tp5buhyn1#
获取日期差,然后使用
MOD
运算符查看它与@days_span
的距离有多近。您需要进行两次比较,因为
MOD
将始终返回正数。因此,如果距离下一个间隔开始还有2天,则模数将为88。这就是@days_high_mod
的用途。