选择上一年12月至本年11月的数据,MySQL

选择上一年12月至本年11月的数据,MySQL,mysql,Mysql,我试图检索上一年12月到今年11月之间的统计数据。我的表格的date列的数据类型为date 下面的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

我试图检索上一年12月到今年11月之间的统计数据。我的表格的
date
列的数据类型为
date

下面的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表中检索数据

更新

下面的代码可以工作,但我希望有一个基于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();
工作示例


这是为了检索呼叫总数图表的呼叫数据。需要在循环中检索结果,以便显示该时间段内每个月的总数。此页面目前正在使用上面的PHP和MySQL代码正常工作,只是希望得到一个基于SQL的解决方案。

您可以使用上面的查询创建一个存储过程,并使用startDate和endDate参数

你可以这样做:

$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();
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
选择
日期,总计(numCalls)为callTotal
从…起
callstats\u callData
哪里
(月(日)>=12年(日)=(年(现在())-1))或
(年(日期)=年(现在())和月(日期)<11);
分组
日期
订购人
日期

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

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
选择
日期,总计(numCalls)为callTotal
从…起
callstats\u callData
哪里
(月(日)>=12年(日)=(年(现在())-1))或
(年(日期)=年(现在())和月(日期)<11);
分组
年(日)、月(日)
订购人
日期

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

这使您可以灵活地为更新的查询选择任意的月和日值,正如您在发布的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;

从何处进行此SQL调用?如果它是由PHP页面或类似页面自动生成的,您可以在那里生成年份;如果您是手工输入的,就没有问题。这是用PHP完成的。我尝试了一个具有日期范围的准备语句,但它没有执行-
。其中date介于:date1和:date2之间
,您应该编辑该信息以及用于原始问题的存储过程的代码。提问101:我们无法帮助您解决您没有告诉我们的问题。对不起,我不相信我使用了存储过程?更新了问题,提到PHP正在检索它。相反,我认为这与SQL语句及其自己编写的语句更相关。错别字,对不起。无论如何,告诉我们你到底做了什么。这给了我这段时间的电话总数。我遗漏了一条关键信息——请参阅问题更新