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

あなたはそのようなことをすることができます:

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

上記のクエリを使用してストアド プロシージャを作成し、引数 startDate と endDate を取得できます。

于 2012-11-08T16:44:15.837 に答える
0

SQL 関数 YEAR(GETDATE()) は現在の年を返します。クエリで使用してみることができます。

于 2012-11-08T17:01:21.807 に答える