选择去年12月到当年11月之间的数据,MySQL

时间:2012-11-08 16:39:45

标签: 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 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();

工作示例

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

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

您可以使用上述查询创建存储过程并使用参数startDate&结束日期。

答案 2 :(得分: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

答案 3 :(得分:0)

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