【问题标题】:Getting the records of last 6 months in mysql在mysql中获取最近6个月的记录
【发布时间】:2018-10-16 14:18:29
【问题描述】:

我一直在处理返回过去 6 个月的查询,例如:

如果当前月份是 2018 年 4 月,则查询应返回最近 6 个月的记录,例如:

  • 2017 年 11 月
  • 2017 年 12 月
  • 2018 年 1 月
  • 2018 年 2 月
  • 2018 年 3 月
  • 2018 年 4 月

我目前的查询是:

SELECT DISTINCT
  monthname(batchEndDate) AS month,
  batchDetails.bATCHiD,
  batchDetails.batchEndDate,
  COUNT(EnrollmentNumber) AS count
FROM candidate
INNER JOIN batchdetails
  ON candidate.batchId = batchDetails.batchId
WHERE (assessmentResult = "pass"
OR assessmentResult = "fail")
AND YEAR(batchEndDate) BETWEEN YEAR(batchEndDate) - 1
AND YEAR(curdate())
GROUP BY MONTH(batchEndDate)
ORDER BY month(batchEndDate);

【问题讨论】:

  • 我建议您阅读“我为什么要为我认为非常简单的 SQL 查询提供 MCVE?” meta.stackoverflow.com/questions/333952/…
  • select distinct monthname(batchEndDate) as month,batchDetails.bATCHiD, batchDetails.batchEndDate,count(EnrollmentNumber) as count..group by month(batchEndDate) is invalid ANSI SQL.. MySQL 允许这样做,但您可以获得不属于 group by 的非聚合列的无效数据

标签: mysql


【解决方案1】:

这是 MySQL 非常有用的日期算法的一项工作。特别是,LAST_DAY() function 让这一切变得简单。

下个月的第一天可以通过以下方式检索:

 LAST_DAY(CURDATE()) + INTERVAL 1 DAY

所以,你想要在那之前的所有记录......

  WHERE batchEndDate < LAST_DAY(CURDATE()) + INTERVAL 1 DAY

六个月前一个月的第一天是

 LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 6 MONTH

所以,你想要在那之后的所有记录。

  WHERE batchEndDate < LAST_DAY(CURDATE()) + INTERVAL 1 DAY
    AND batchEndDate >= LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 6 MONTH

您想按月分组。你这样做

GROUP BY LAST_DAY(batchEndDate)

那么你的查询看起来像这样

select LAST_DAY(batchEndDate) as month_ending,
       monthname(LAST_DAY(batchEndDate)) as month,
       count(EnrollmentNumber) as count 
  from candidate 
 inner join batchdetails on candidate.batchId = batchDetails.batchId 
 where (assessmentResult="pass" or assessmentResult="fail") 
   and batchEndDate < LAST_DAY(CURDATE()) + INTERVAL 1 DAY
   and batchEndDate >= LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 6 MONTH
 GROUP BY LAST_DAY(batchEndDate)

【讨论】:

  • 我相信应该是 LAST_DAY()... + INTERVAL 1 MONTH 和 - INTERVAL 5 MONTH。 OP 希望包括当前月份。
  • select LAST_DAY(batchEndDate) as month_ending, monthname(batchEndDate) as month, count(EnrollmentNumber) as count .. GROUP BY LAST_DAY(batchEndDate) is invalid ANSI SQL.. MySQL 允许这样做,但您可以获得 invalid 不在 group by 中的非聚合列的数据,在这种情况下为 @ 987654331@
  • @RaymondNijland :batchEndDate 在功能上依赖于 group by 子句,所以没关系。 @Salman 如果今天是 2018 年 10 月 15 日,那么 LAST_DAY(CURDATE()) + INTERVAL 1 DAY + INTERVAL 1 MONTH 是 2018 年 12 月 1 日。这还包括当前月份之后的月份。
  • 我感觉你会提出功能依赖..但这仅适用于键 -> dev.mysql.com/doc/refman/5.7/en/… ..
猜你喜欢
  • 1970-01-01
  • 2011-03-08
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多