我正在尝试检索去年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的解决方案。
答案 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())返回当前年份。您可以尝试在查询中使用它。