ここにあなたへの質問があります。ユーザー変数を使用してクエリ範囲の終わりを示しますが、最終バージョンでは代わりにパラメーター プレースホルダーを使用する可能性があります。は、クエリした範囲の後@end
の最初の日です。つまり、範囲の排他的な終了日です。
SET @begin = '2013-01-02';
SET @end = '2013-01-07';
SELECT
SUM(DATEDIFF(IF(CAST(c.end AS date) > CAST(@end AS date),
CAST(@end AS date),
CAST(c.end AS date)
),
IF(c.begin < CAST(@begin AS date),
CAST(@begin AS date),
c.begin
)
) * c.budget
) AS overall_budget
FROM
(SELECT a.id_campaign,
a.date begin,
MIN(IFNULL(b.date, CAST(@end AS date))) end,
a.budget
FROM campaign_budgets_history a
LEFT JOIN campaign_budgets_history b
ON a.id_campaign = b.id_campaign AND a.date < b.date
WHERE a.date < CAST(@end AS date)
GROUP BY a.id_campaign, a.date
HAVING end > CAST(@begin AS date)
) c;
SQL Fiddleでテスト済み。すべてのキャストが必要と思われる理由は不明ですが、一部を回避する方法がある可能性があります。しかし、上記は機能しているように見えますが、キャストが少ない一部のバージョンでは機能しませんでした。
アイデアは、サブクエリが範囲のテーブルを作成し、それぞれが特定の予算が有効であった日付を示すというものです。クエリ範囲の先頭と一致するように、最初の範囲の先頭を調整する必要がある場合があります。次に、日付を差し引いてそれぞれの日数を取得し、その数に 1 日の予算を掛けます。