最近 x 个月的排名查询

Posted

技术标签:

【中文标题】最近 x 个月的排名查询【英文标题】:Ranking query from the last x months 【发布时间】:2017-04-20 21:49:23 【问题描述】:

我想从我的 mysql 服务器获取过去 x 个月的所有记录。以 2 个月为例(不是从过去 2 个月开始,比如过去 60 天,而是从过去一个月开始等等。如果实际月份是 4 月,我想要 2 月和 3 月的所有记录)。 我尝试了一些查询,最后一个是

SELECT id FROM ranking WHERE (end_date BETWEEN DATE_FORMAT(NOW(), '%Y-%m-01') AND DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 2 MONTH), '%Y-%m-%d'))

“end_date”是我的日期列,它是 DATE 列“2017-04-07”。

上面的查询什么也没返回,我不知道错误在哪里。

【问题讨论】:

end_date 是什么数据类型? 尝试在您的查询“end_date >= dateadd(month, -2, getdate())”中使用它。让我知道它是否有效 @McNets,这只是一个例子,哈哈。实际的查询要大得多,也更复杂一些,所以我对其进行了简化以涵盖“错误”,我必须承认我在发明列名方面很糟糕:/ 【参考方案1】:

试试这个:

SELECT id
FROM ranking
WHERE end_date BETWEEN
DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 3 MONTH)) INTERVAL 1 DAY)
AND LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH));

它像这样计算日期:

对于范围内的开始日期,它从当前日期减去 3 个月,获取该月的最后一天并在其中添加一天以获得下个月的第一天(在我们的例子中是 2 月 1 日) 对于结束日期,它从当前日期减去一个月,并获得该月的最后一天(在我们的例子中是 3 月 31 日)

【讨论】:

是的,就是这样!非常感谢。【参考方案2】:

尝试不将其转换为字符串,并且 BETWEEN 首先需要最小日期。

SELECT id 
FROM ranking 
WHERE end_date BETWEEN LAST_DAY(CAST(NOW() as date) - INTERVAL 2 MONTH 
               AND CAST(NOW() as date)

【讨论】:

如果我想获取 2 个月到现在的记录,那将是可行的,但是正如我所说,无论如何我只想获取过去几个月的记录,谢谢您的帮助

以上是关于最近 x 个月的排名查询的主要内容,如果未能解决你的问题,请参考以下文章

平衡树

如何结合这两个查询来计算排名变化?

查询给定日期 X 个月的销售总额

SQL Server - 我如何对上个月的产品进行排名?

php+mysql中怎么查询最近12个月每个月的数据

SQL 查询获取主选择查询上的行排名或位置