2012-04-03 59 views
2

我想在選定的日期內計算付款,但我無法弄清楚如何操作。在MySQL中計算日期範圍內的付款

下面是從我的表

id starts_from  payment_per_day 
======================================= 
1  2012-01-01  10,000.00 
2  2012-01-15  10,500.00 
3  2012-02-01  11,000.00 
4  2012-02-15  11,500.00 
5  2012-03-01  12,000.00 

示例數據如何指望我支付總額從2012-01-21到2012-02-20?

付款總額應爲338,500

from 2012-01-21 to 2012-01-31 = 11 days * 10,500 
from 2012-02-01 to 2012-02-14 = 14 days * 11,000 
from 2012-02-15 to 2012-02-20 = 6 days * 11,500 

但是,如果我這樣做:

SELECT SUM(payment_per_day) as total FROM table 
WHERE starts_from BETWEEN '2012-01-21' AND '2012-02-20' 

結果只有22,500

任何想法?

回答

2

我會先擴大範圍到日期列表,然後使用下面的查詢:

SELECT SUM(p1.payment_per_day) 
FROM dates d 
    INNER JOIN payments p1 ON p1.starts_from <= d.date 
    LEFT JOIN payments p2 ON p2.starts_from <= d.date 
         AND p2.starts_from > p1.starts_from 
WHERE p2.id IS NULL 

你可以獲取從列表在一個數字的幫助範圍表,就像這樣:

SELECT DATE_ADD(@date_from, INTERVAL num DAY) 
FROM numbers 
WHERE num BETWEEN 0 AND DATEDIFF(@date_to, @date_from) 

Numbers表格是值得擁有的,因爲它可以在許多情況下是有用的,所以考慮提供自己的一個事情。這裏有一個非常簡單的腳本來創建和初始化一個數字表:

CREATE TABLE numbers AS SELECT 0 AS num; 
SET @ofs = (SELECT COUNT(*) FROM numbers); INSERT INTO numbers SELECT @ofs + num FROM numbers; 
SET @ofs = (SELECT COUNT(*) FROM numbers); INSERT INTO numbers SELECT @ofs + num FROM numbers; 
SET @ofs = (SELECT COUNT(*) FROM numbers); INSERT INTO numbers SELECT @ofs + num FROM numbers; 
… /* repeat as necessary, each line doubles the number of rows in the table */ 

但是,當然,你可以使用一個循環來代替。

Here's我在SQL小提琴上的完整測試環境(供任何人玩)。

+0

太棒了,謝謝 – Siwan 2012-04-04 08:40:45

5
SELECT SUM(payment_per_day) as total FROM table 
WHERE starts_from BETWEEN '2012-01-21' AND '2012-02-20'; 
+0

我想要的是從2012-01-21 + 2012-01-22 + 2012-01-23 + ... + 2012-02-20統計每天的總付款。我怎樣才能做到這一點 ? – Siwan 2012-04-03 10:34:31

0

似乎幾乎不可能做這樣的查詢,計算選定日期內的每天付款總額。

因此,我通過從所有starts_from日期中選擇數據,直到< = 2012-02-20,然後選擇最後一個小於2012-01-21(即2012-01-15)的starts_from日期,以便得到payment_per_day 10,500.00

感謝您查看我的問題:)