注册 登录
编程论坛 VFP论坛

求助,如何分段计算月数

y12692189 发布于 2022-10-17 10:24, 1176 次点击
常量为几个固定时间节点,比如2000-1-1,2010-1-1,2015-1-1,我想输入一个开始日期,一个结束日期,计算出在各个时间段各包含几个月,怎么写呢?

应用与物业费计算程序,各个时间节点的收费价格不同,所以要分段计算。

1990-1-1至1999-12-31,0.1元/月
2000-1-1至2009-12-31,0.5元/月
2010-1-1至2014-12-31,0.8元/月
2015-1-1至今1.2元/月

有大神有什么好的方法吗?
8 回复
#2
fyyylyl2022-10-17 10:46
PARAMETERS  date1,date2
    n=1
DO WHILE .t.
    IF GOMONTH(date2,n)<=date1
        n=n+1
    ELSE
        EXIT
    ENDIF
ENDDO
RETURN n
#3
y126921892022-10-17 15:53
回复 2楼 fyyylyl
我想依据我输入的开始结束时间来计算应该收多少钱,您这个只能计算两个时间段之间的月份,和我想的不太一样。
但是也很感谢您的回复。
#4
sdta2022-10-17 18:31
给点数据,便于测试。
#5
laowan0012022-10-18 07:57
问题并不是算出两日期间有几个月就行,由于各年收费标准不同,所以要计算两日期间覆盖了哪些年
按楼主给出的例子,在一个自然年度内的标准是一样的,所以计算两头年份月数(用12-日期所在月+1),从而得到收费金额,中间年份按12*收费标准,累加可得出总收费金额
#6
fyyylyl2022-10-18 09:23
PARAMETERS  date1,date2
CREATE CURSOR Cstan(sdate d,edate d,standard N(6,1))
INSERT INTO Cstan(sdate,edate,standard ) Value({^1990.1.1},{^1999.12.31},0.1)
INSERT INTO Cstan(sdate,edate,standard ) Value({^2000.1.1},{^2009.12.31},0.5)
INSERT INTO Cstan(sdate,edate,standard ) Value({^2010.1.1},{^2014.12.31},0.8)
INSERT INTO Cstan(sdate,edate,standard ) Value({^2015.1.1},DATE(),1.2)

IF date2<date1
    tmp_date=date1
    date1=date2
    date2=tmp_date
ENDIF
date1=date1-DAY(date1)+1        &&起始按月初
date2=GOMONTH(date2,1)-DAY(date2)    &&终止按月末

    nMoney=0
    n=0
DO WHILE .t.
    cur_date=GOMONTH(date1,n)
    IF cur_date<=date2
        SELECT standard FROM cstan  WHERE BETWEEN(cur_date,Sdate,Edate) INTO CURSOR tmp_stan
            nMoney=nMoney+standard
        USE
        n=n+1
    ELSE
        EXIT
    ENDIF
ENDDO
RETURN nMoney

#7
hu9jj2022-10-18 09:57
解题思路:
1、先根据收物业费的起始时间确定适用哪个收费标准段;
2、再根据收费标准段的结束时间来计算应该收物业费的天数;
3、如果收物业费的结束时间大于此收费标准段则进入下一收费标准段,然后重复第2步;
4、分别显示各收费标准段的天数及收费金额以及合计金额。
#8
y126921892023-03-15 14:24
回复 6楼 fyyylyl
您写的非常好,我测试了,确实没问题,我写的比您这个复杂,因为涉及到退费问题,再次表示感谢
#9
sdta2023-03-15 22:59
实际上计算两个日期之间共有多少个月份是可以用公式解决的
(YEAR(Date2) - YEAR(Date1)) * 12 + MONTH(Date2) - MONTH(Date1) + 1
其中 Date2 >= Date1
如:
2023-01-01 至 2023-01-01 结果=1个月
2022-12-01 至 2023-01-01 结果=2个月
2023-01-01 至 2023-03-01 结果=3个月
经验证上面的公式计算结果是正确的
1