当我将月份和年份用作投入时,我被迫试图返回过去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 ;
答案 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/2016
到08/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