我正在尝试从我的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等)。我该怎么做?
答案 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())
它可能更简单,但这个想法就是这个。