2012-04-03 73 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

感谢您查看我的问题:)