三个表:
表1 : BaseInfo 基础数据 记录面积 收费开始日期 结束日期
表2: Price 记录月单价 价格有效起始日期 结束日期
表1 : BaseInfo 基础数据 记录面积 收费开始日期 结束日期
表2: Price 记录月单价 价格有效起始日期 结束日期
Create table BaseInfo ( id int(4) PRIMARY auto_increment, name varchar(10) not null , area DECIMAL(10,2), feestartdate date, feeenddate date ); Create table Price ( pid int(4) PRIMARY auto_increment, name VARCHAR(10) not null, amount DECIMAL(10,2), pricestartdate date, priceenddate date ); insert into BaseInfo(name,area,feestartdate,feeenddate) values(""A1"",25.2,""2015-06-05"",""2016-07-02""),(""A2"",31.2,""2015-06-01"",""2015-07-31""),(""A3"",20,""2015-06-30"",""2015-07-25""); insert into Price(name,amount,pricestartdate,priceenddate) values(""A1"",2.5,""2015-01-01"",""2015-06-15""),(""A1"",3.1,""2015-06-16"",""2015-12-31""),(""A2"",3.1,""2015-01-01"",""2015-12-31""),(""A3"",3.1,""2015-01-01"",""2015-6-30""),(""A3"",2.9,""2015-07-01"",""2015-12-31"");
要求:任意一个月任意一个name的 月度总额。
规则如下:
总额=面积*月单价
计算的时候:
1,需考虑name 计费起始日期,假如起始日期不为当日的1日,则以天数计算。
如计算A3 6月份的总额 ,则这么计算如下: 面积:20*(1/30)*3.1 =2.07 元(结果四舍五入保留2位数),6月份计费从最后一天算起,所以只算一天。原因是单价为月单价,故除以30天。
如计算A2 6月份的总额,则计算如下:面积 31.2*3.1=96.72。
2. 计算时,月单价取值也需考虑有效期。假如一个月单价上半月和下半月价格不同,那么分别以天计算后,合并起来就是一月的总额。例如计算A1的 6月份的总额计算如下: 面积 25.2*((15-5+1)/30)*2.5+25.2*((30-16+1)/30)*3.1 = 62.16 元
即计算时:需考虑计费有效日期 和 月单价有效日期。
原因是这个计算涉及到多区域日期的计算,本人尝试了一下,发现要么用函数,要么用SQL语句实现。目前对于SQL语句,暂无灵感。特放出来,大家研究研究,看看一条SQL语句能否可实现任意指定月份的计算。
解决方案:100分
看上去好复杂的需求啊。