选择任何3个月前的DATE

时间:2013-08-06 10:24:26

标签: mysql date intervals

我正在尝试从我的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 个答案:

答案 0 :(得分:2)

您需要使用模运算符。

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

第二个想法,您应该使用MONTH()DAY()代替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);

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

答案 2 :(得分:1)

考虑到#34;恰好三个月前"可能有点,呃,没有说明。如果是5月31日,那么"三个月前"? 2月31日???? 3月3日????? ;)

所以,最好在90天前使用""或者" 12周前"哪两个都使用类似的mod方法。这两者都有非常精确的定义。几个月的事情会让你撞到桌子上。但是,它可能是规范,你没有选择。在这种情况下,请务必针对各种月末案例进行测试。

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

DEMO HERE

它可能更简单,但这个想法就是这个。

相关问题