选择最近3个月的MySQL记录。

3

如果MySQL表格有以下列,那么选择过去三个月内的所有行的最聪明方法是什么:

| id (int) | year (int)| month (int) |

考虑到如果当前月份和年份是例如2.2016,我需要选择所有11.2015& 12.2015& 1.2016的记录。

如果当前月份大于3,这很容易,因为我需要选择的所有月份都在同一年中,所以我可以从当前月份减去3并运行简单查询。

SELECT * FROM mytabe where year=2016 and month >= xx

1
如果你向我们展示一些方法,我们会告诉你哪个是最聪明的。 - undefined
@Strawberry 我的意思是,我可以在PHP中编写一些if/else语句并准备几个不同的查询,但我不认为这是最好的方法。 - undefined
嗯,最聪明的方法可能是将年份和月份(或许日期)作为一个整体存储。 - undefined
是的,我完全同意,但在这里我无能为力。我只能使用数据库中已有的内容。 - undefined
3个回答

4
Select * from mytable where STR_TO_DATE(concat(year,"-",month,"-01"),'%Y-%m-%d')>date_sub(curdate(),Interval 3 month) ;

上面的查询将从三个月前的今天获取年份和月份。

年份?不是大于等于吗?而且,如果在一月或二月使用curdate()函数,你会得到上一年和月份(即月份将为11或12)。那么,第1个月怎么会大于11或12呢? - undefined
@Used_By_Already 谢谢你的建议,我已经更新了我的答案。 - undefined
@Undefined_variable 是的,你的查询函式是正确的,只需要做两个修正 - 在 mytable 之后你漏写了 WHERE ,而且 Interval 3 months 应该改为 Interval 3 month 没有 sSELECT * FROM mytabe WHERE STR_TO_DATE(CONCAT(Year,"-",Month,"-01"),'%Y-%m-%d')>DATE_SUB(curdate(),INTERVAL 3 MONTH) - undefined
@metost 进行了更改 - undefined
做得好。当然,存储日期会更好,但这并不影响这个解决方案。 - undefined
我同意,但在评论中@metost说他不能更改表结构。 - undefined

2
你可以通过以下查询选择三个月份的记录。 columnName表示要选择哪个列的数据。 tableName表示要选择哪个表的数据。 dateColumnName表示要选择哪个基于日期的列的数据。
它将返回从今天起上个月的数据。
SELECT columName FROM tableName WHERE dateColumName BETWEEN ( DATE(NOW()) - INTERVAL 1 MONTH) AND Date(Now())

它将从今天返回“倒数第二个月”的数据。
SELECT columName FROM tableName WHERE dateColumName BETWEEN ( DATE(NOW()) - INTERVAL 2 MONTH) AND ( DATE(NOW()) - INTERVAL 1 MONTH)  

它将从今天返回倒数第三个月的数据。
SELECT columName FROM tableName WHERE dateColumName BETWEEN ( DATE(NOW()) - INTERVAL 3 MONTH) AND ( DATE(NOW()) - INTERVAL 2 MONTH) 

希望能帮助到其他人。


0

请试一下

Select * from mytable where STR_TO_DATE(concat(year,"-",month,"-01"),'%Y-%m-%d')>date_sub(curdate(),Interval 3 month) ;

你能添加一个简短的描述吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接