考虑表Credits

 CREATE TABLE `Credits` (
  `UserID` int(11) unsigned NOT NULL DEFAULT '0',
  `Amount` int(11) NOT NULL DEFAULT '0',
  `Created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `Expire` datetime NOT NULL DEFAULT '9999-12-31 23:59:59'
)

使用数据:
UserID    Amount    Created       Expire
1         10        2016-01-14    2016-05-30
1         -2        2016-02-04    9999-12-31
1         3         2016-06-01    2016-09-30

如果没有到期处理,要获取用户的当前数量,可以通过简单的select来处理
 SELECT SUM(Amount) FROM Credits WHERE UserID = 1;

现在,我需要编写一个select查询,输入参数为date,并且能够得到当时可用的信用额度,如下所示。
在…
2016-01-15=>10
2016-02-06=>8
2016-05-31=>0
2016年6月3日
有可能只有上面的模式吗?或者我需要添加额外的字段?
SqlFiddle:http://sqlfiddle.com/#!9/3a52b/3

最佳答案

当您进行负Amount交易时,您应该找到相应的正Amount交易并设置相同的到期日。这样,你就可以存储你所花费的信用额度的到期日。示例表如下所示:

UserID    Amount    Created       Expire
1         10        2016-01-14    2016-05-30
1         -2        2016-02-04    2016-05-30
1         3         2016-06-01    2016-09-30

这使得查询任何特定日期的余额看起来如下所示:
SELECT SUM(Amount) FROM Credits WHERE UserID = 1 and @date between Created and Expire;

注意,您可能需要拆分一个金额为负的交易,以覆盖不同到期日的信贷。例如,您有下表:
UserID    Amount    Created       Expire
1         10        2016-01-14    2016-05-30
1         10        2016-02-04    2016-06-30

如果您想与Amount=-15进行交易,则需要创建两条记录:
UserID    Amount    Created       Expire
1         -10       2016-04-26    2016-05-30
1         -5        2016-04-26    2016-06-30

要查找尚未消费或已过期的信用及其到期日期,可以使用以下查询:
select sum(Amount) as Amount, Expire
from Credits
where UserID = 1 and curdate() <= Expire
group by Expire
having sum(Amount) > 0
order by Expire

关于mysql - 处理交易表中的到期信用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36832146/

10-15 08:20