2

我正在尝试从我的 MySQL 数据库中获取一个结果集,其中列出了所有帐户的开始日期都位于任何季度之前(因此是 3、6、9、12 等个月前)。以下查询适用于单个季度:

SELECT `id`, `name`, `date_start` FROM `accounts`
WHERE `account_status_id`=2
AND DATE_FORMAT(`date_start`, '%m%d') = DATE_FORMAT(
    DATE_SUB(NOW(), INTERVAL 1 QUARTER), '%m%d'
);

这列出了 3 个月前开始的所有内容,这很好。但我也希望选择 3 个月前的任何乘法(如 6、9 等)。我该怎么做?

4

4 回答 4

2
SELECT `id`, `name`, `date_start`
FROM `accounts`
WHERE `account_status_id`=2
and dayofmonth(date_start) = dayofmonth(curdate())
and month(date_start) % 3 = month(CURDATE()) % 3
于 2013-08-06T10:38:42.547 回答
2

您需要使用模运算符。

这只是我的想法,所以它可能并不完全正确,但它应该足以让你走上正确的轨道。在这种情况下,mod 运算符将返回 0,返回三个月的任意倍数。

再三考虑,您可能应该使用MONTH()andDAY()而不是DATE_FORMAT

SELECT `id`, `name`, `date_start` FROM `accounts`
WHERE `account_status_id`=2
AND DAY(`date_start`) = DAY(NOW())
AND ((( MONTH(NOW()) - MONTH(`date_start`)) mod 3) = 0);
于 2013-08-06T10:37:39.480 回答
1

考虑一下“恰好三个月前”可能有点,呃,未指定。如果是 5 月 31 日,什么是“三个月前”?2月31日???3月3日????;)

因此,最好使用“90 天前”或“12 周前”,它们都使用类似的 mod 方法。这两个都有非常精确的定义。几个月的事情会让你把头撞在桌子上。但是,它可能是规范,您别无选择。在这种情况下,请务必针对各种月末案例进行测试。

于 2013-08-06T18:37:30.573 回答
0

尝试这个 ,

   SELECT `id`, `name`, `date_start` FROM `accounts`
   WHERE MONTH(`date_start`)- MONTH(NOW())  IN (-3,-6,-9,0,3,6,9)

如果您还想检查确切的日期,请添加此

   AND  DAY(`date_start`) = DAY(NOW())

在这里演示

它可能更简单,但想法是这样的。

于 2013-08-06T11:25:12.400 回答