Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 给定两个日期之间的天数,将月内的天数视为固定的30天_Excel_Date - Fatal编程技术网

Excel 给定两个日期之间的天数,将月内的天数视为固定的30天

Excel 给定两个日期之间的天数,将月内的天数视为固定的30天,excel,date,Excel,Date,我需要用一个月30天的固定逻辑计算两个日期之间的差异。示例如下所示 开始日期=2018年10月4日 截止日期=2018年10月28日 在=199之间的预期天数 天数差异的Excel计算=>2018年10月28日-2018年4月10日=201这不是我需要的 计算两个日期的差值的依据是,应该考虑一个月内的天数为30天,而不考虑月份。因此,开始日期和结束日期之间的所有月份(31天)应视为30天。如果中间有2月,则也应视为每月30天。 计算两个给定日期之间天数的程序: 起始月份天数的分数=2018年4月

我需要用一个月30天的固定逻辑计算两个日期之间的差异。示例如下所示

开始日期=2018年10月4日 截止日期=2018年10月28日 在=199之间的预期天数 天数差异的Excel计算=>2018年10月28日-2018年4月10日=201这不是我需要的 计算两个日期的差值的依据是,应该考虑一个月内的天数为30天,而不考虑月份。因此,开始日期和结束日期之间的所有月份(31天)应视为30天。如果中间有2月,则也应视为每月30天。 计算两个给定日期之间天数的程序:

起始月份天数的分数=2018年4月30日-2018年4月10日=21天 2018年1月5日至2018年9月30日之间的月份=5个月=5 x 30=150天 上月天数分数=2018年10月28日-2018年10月1日=28天 总天数=21+150+28=199天

如果A1是开始日期单元格,B1是结束日期单元格,请建议如何在excel中执行此操作。

试试这个

=SUMPRODUCT(--(DAY(ROW(INDIRECT(A2&":"&B2)))<>31))+
(DAY(A2)=31)+
 SIGN(SUMPRODUCT((MONTH(ROW(INDIRECT(A2&":"&B2)))=2)*(DAY(ROW(INDIRECT(A2&":"&B2)))=28)))*2

我将公式分解为三个部分,如您的示例所示:

D2:G2中的公式为:

D2: =IF(AND(YEAR(A2)=YEAR(B2),MONTH(A2)=MONTH(B2)),MIN(DATE(YEAR(A2),MONTH(A2),30),B2),DATE(YEAR(A2),MONTH(A2),30))-MIN(DATE(YEAR(A2),MONTH(A2),30),A2)+1
E2: =MAX(((YEAR(B2)-YEAR(A2))*12+MONTH(B2)-MONTH(A2)-1)*30,0)
F2: =MIN(IF(AND(YEAR(B2)=YEAR(A2),MONTH(B2)=MONTH(A2)),0,B2-DATE(YEAR(B2),MONTH(B2),1)+1),30)
G2: =SUM(D2:F2)
或者,一应俱全:

=IF(AND(YEAR(A2)=YEAR(B2),MONTH(A2)=MONTH(B2)),MIN(DATE(YEAR(A2),MONTH(A2),30),B2),DATE(YEAR(A2),MONTH(A2),30))-MIN(DATE(YEAR(A2),MONTH(A2),30),A2)+1+MAX(((YEAR(B2)-YEAR(A2))*12+MONTH(B2)-MONTH(A2)-1)*30,0)+MIN(IF(AND(YEAR(B2)=YEAR(A2),MONTH(B2)=MONTH(A2)),0,B2-DATE(YEAR(B2),MONTH(B2),1)+1),30)

我喜欢@Jeeped代码的优雅,但这可能更容易理解。

在我看来,你的例子有点不可靠,比如31号有时是开始/结束日期,而不是其他日期

不管怎么说,这个函数并不漂亮,但它做到了:

Function No31st(startDate As Date, endDate As Date) As Long
    Dim d As Date
    For d = startDate To endDate 'iterate each day in range
        If Day(d) <= 30 Then 'count days up to the 30th
            No31st = No31st + 1
            'if it's Feb 28, add 2 more days
            If (Month(d) = 2 And Day(d) = 28) Then
                No31st = No31st + 2 ' + Feb 29 + Feb 30
                If Day(d + 1) <> 1 Then d = d + 1 'leap year
            End If
        End If
    Next d
    'since the 31st counts if it's the last day:
    If Day(startDate) = 31 Or Day(endDate) = 31 Then No31st = No31st + 1
End Function
DAYS360公式基于12个月30天的逻辑。

简单易行的方法:

一,

二,


如果开始日期或结束日期是31号怎么办?例如,1月31日到3月31日有多少天,和1月30日到4月1日还是1月29日到1月29日相比如何?如果开始日期是,则应该考虑为1个月。1月31日至3月31日之间的天数=>1天,2月30日,3月30日=>1+30+30=61天2018年4月30日至2018年4月10日之间的天数为21天。白天包括在内。因此,将+1添加到差值中。谢谢你的快速回复。你有没有可能把其他日子排除在计算之外,比如周末?我从未见过任何形式的会计不包括一年8天。=SUMPRODUCT-DAYROWINDIRECTA2&:&B231,我将让您计算2月、1月31日和闰年的调整。这将返回1月31日至2月1日的4。我不知道为什么我还要花时间在这个非常有用的ashleedawg上。非常感谢您的建议,我通过将2月分为部分和整个月份进行处理,测试并确定了=SUMPRODUCT-DAYROWINDIRECTA2&:&B231公式完全适合该场景。非常感谢你。很好的解决方案。只有一种情况,Sumproduct公式不起作用。2018年1月31日至2018年3月31日-计算结果为=>开始月份的天数一月=1天+中间月份的完整月份数完整月份数=2,二月完整月份=1个月=视为30天+三月完整月份=30天=61天。Sumproduct公式给出58天。@ashleedawg-对于1月31日至2月1日的示例,此公式正确返回2。1月31日至3月31日应为61天,2月28日至3月1日应为4天。再次修正公式,以说明2月28日至3月1日为4天,2月28日至2月30日=3天,加上3月1日=3天+1@RobGale,是的,如果二月是一个月的开始或结束,然后应该考虑每月的实际时间,计算月份的日利率。如果Feb作为一个完整的月份介于开始月份和结束月份之间,则无论monthbrilliant解决方案中的天数是多少,每月费率都将应用于Feb。非常感谢你
StartDate   endDate    result
10/4/2018   28/10/2018  199
31/1/2018   31/3/2018    61
28/2/2018   1/3/2018      4
28/2/2000   1/3/2000      4
31/1/2018   1/2/2018      2
=YEARFRAC(start_date,end_date,4)*360
=DAYS360(start_date,end_date)