2012-11-08 440 views
1

我想检索上一年的12月和当年的11月之间的统计数据。我的表的date列的数据类型为date选择上一年的12月和当年的11月之间的数据,MySQL

以下SQL可以正常工作,但只有在手动更改年份时才起作用。在这段时间内,如何实现同样的动态变化的一年?

SELECT date, SUM(numCalls) AS callTotal FROM callstats_callData 
WHERE date BETWEEN '2011-12-01' AND '2012-11-01' 
GROUP BY date ORDER BY date 

PHP正在从MySQL表中检索数据。

UPDATE

以下作品中的代码,但我希望能有一个基于SQL的解决方案。

$date1 = (date("Y") - 1) . '12-01'; 
$date2 = date("Y") . '-11-01'; 
$fetchTotals = $this->contentDB->prepare("SELECT date, SUM(numCalls) AS callTotal FROM callstats_callData 
WHERE date BETWEEN ? AND ? 
GROUP BY date ORDER BY date"); 
$fetchTotals->execute(array($date1, $date2)); 
$totals = $fetchTotals->fetchAll(); 

工作实例

这是呼叫总数图表here恢复呼叫数据。结果需要循环检索才能显示该时间段内每月的总数。此页面目前正在使用上面的PHP代码正常工作,只是希望有一个基于SQL的解决方案。

+0

凡被从制作这个SQL调用?如果它是由PHP页面或类似的自动/生成的,你可以在那里生成一年;如果你手工输入,你没有问题。 – jfmatt

+0

这是在PHP中完成的。我尝试了一个包含日期范围的准备好的语句,并且它没有执行 - '... WHERE date date BETWEEN:date1 AND:date2' – NightMICU

+0

您应该编辑该信息以及您用于原始问题的存储过程的代码。问题101:我们无法帮助你解决你没有告诉我们的问题。 – jfmatt

回答

2

这给了你在更新的查询选择任意的月份和日期值的一点灵活性 - 因为你在发布PHP代码设置:

SELECT date, SUM(numCalls) AS callTotal 
FROM callstats_callData 
WHERE DATE(date) 
BETWEEN CONCAT(YEAR(CURDATE())-1,'-12-01') AND CONCAT(YEAR(CURDATE()),'-11-01') 
GROUP BY date ORDER BY date; 
+0

钉钉!谢谢:) – NightMICU

+0

很高兴听到它! :) – nickhar

0

您可以使用上述查询创建存储过程并采用参数startDate & endDate。

0

你可以做这样的事情:

SELECT 
    date, SUM(numCalls) AS callTotal 
FROM 
    callstats_callData 
WHERE 
    (MONTH(date) >= 12 AND YEAR(date) = (YEAR(NOW()) - 1)) OR 
    (YEAR(date) = YEAR(NOW()) AND MONTH(date) < 11); 
GROUP BY 
    date 
ORDER BY 
    date 

编辑: 看到你的评论,我想做到最好的办法那就是:

SELECT 
    date, SUM(numCalls) AS callTotal 
FROM 
    callstats_callData 
WHERE 
    (MONTH(date) >= 12 AND YEAR(date) = (YEAR(NOW()) - 1)) OR 
    (YEAR(date) = YEAR(NOW()) AND MONTH(date) < 11); 
GROUP BY 
    YEAR(date), MONTH(date) 
ORDER BY 
    date 
+0

这给了我那段时间的总呼叫次数。我遗漏了一个重要的信息 - 在一分钟内看到问题更新 – NightMICU

+0

刚编辑它,使它按月份和年份分组。 –

0

的sql函数YEAR(GETDATE())返回当前年份。您可以尝试在查询中使用它。

相关问题