1

我正在尝试检索上一年 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();

工作示例

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

4

4 回答 4

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;
于 2012-11-08T17:05:57.710 回答
0

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

于 2012-11-08T16:44:15.837 回答
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
于 2012-11-08T17:00:23.377 回答
0

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

于 2012-11-08T17:01:21.807 回答