【问题标题】:Ranking query from the last x months最近 x 个月的排名查询
【发布时间】: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,这只是一个例子,哈哈。实际的查询要大得多,也更复杂一些,所以我对其进行了简化以涵盖“错误”,我必须承认我在发明列名方面很糟糕:/

标签: php mysql sql ranking


【解决方案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 个月到现在的记录,那将是可行的,但是正如我所说,无论如何我只想获取过去几个月的记录,谢谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多