按月和年输入选择之前的12个月

时间:2017-10-09 13:38:55

标签: mysql

当我将月份和年份用作投入时,我被迫试图返回过去12个月的总数。

我可以根据输入得到整整一年(从1月到12月),但我想说的是如果我输入('08','2017')它将计算08 / 2016-08 /的总数2017。

我知道我必须添加另一个输入并为其赋值IN targetMonth int,但我不确定如何进行INTERVAL。

'date_admitted'列的值为'2010-01-30'。基本上,结果表将如下所示:

Month    Total  %
08 2016   10    16
09 2016   10    16
10 2016   10    16
11 2016   10    16
12 2016   10    16
01 2017   10    16
  etc    etc   etc

继承我计算一整年的代码

DROP PROCEDURE IF EXISTS YrReport;
DELIMITER //
CREATE PROCEDURE YrReport( 
IN targetYear int)
BEGIN
SELECT DATE_FORMAT(date_admitted, '%m') 
AS Month,
COUNT(id) 
AS Total,
ROUND(COUNT(id) / (SELECT COUNT(id) FROM 
accessions  
WHERE year(date_admitted) = targetYear)*100)
AS '%'
FROM accessions 
WHERE year(date_admitted) = targetYear
GROUP BY DATE_FORMAT(date_admitted, '%Y%m');
END //
DELIMITER ;

2 个答案:

答案 0 :(得分:1)

我没有查看您编写的所有代码,但似乎您可以通过更改WHERE条件来解决问题。我们假设您的存储过程有第二个参数,

....
IN targetMonth int)

然后你可以替换

WHERE year(date_admitted) = targetYear

通过

WHERE ((YEAR(date_admitted) = targetYear) AND
       (MONTH(date_admitted) < targetMonth)) OR
      ((YEAR(date_admitted) = (targetYear - 1)) AND
       (MONTH(date_admitted) >= targetMonth))

并在必要时以类似方式更改其他WHERE条件。

回到你的例子,这将选择08/2016(包括)到07/2017(包括),这是12个月。如果您希望它选择09/201608/2017,您可以调整代码。

我认为与其他解决方案相比,这种方式运行速度非常快,但只有在您想要包含一年的情况下才会有效。例如,您无法轻松地将该代码调整为包含13个月。

答案 1 :(得分:0)

以下是您的需求:

如果你有一个数字年份,例如2016,你可以使用这样的表达式来检索该日历中date_admitted的所有行。

WHERE date_admitted >= MAKEDATE(year, 1)
  AND date_admitted <  MAKEDATE(year, 1) + INTERVAL 1 YEAR

如果您有一天的某个日期戳,并且您想要在该日之前(而不是年初至今)检索十二个月的数据,请执行此操作。

WHERE date_admitted >= LAST_DAY(datestamp) + INTERVAL 1 DAY - INTERVAL 13 MONTH
  AND date_admitted <  LAST_DAY(datestamp) + INTERVAL 1 DAY - INTERVAL 1 MONTH

这对当前日期特别有用。

WHERE date_admitted >= LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 13 MONTH
  AND date_admitted <  LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH

如果您需要按月分组,请执行以下操作

 SELECT SUM(something), COUNT(*), LAST_DAY(date_admitted) month_ending
   FROM someTable
  GROUP BY LAST_DAY(date_admitted)

使用MySQL date arithmetic可能会有点冗长。但它允许您进行大量的日期过滤和精确分组。

这是一个成语。包含日期戳的月份的第一天是

LAST_DAY(datestamp) + INTERVAL 1 DAY - INTERVAL 1 MONTH