【问题标题】:Number of days in between given two dates treating number of days in month as fixed 30 days给定两个日期之间的天数,将月份中的天数视为固定 30 天
【发布时间】:2018-05-26 12:13:29
【问题描述】:

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

  1. 开始日期 = 2018 年 10 月 4 日
  2. 结束日期 = 28/10/2018
  3. 预计之间的天数 = 199
    (Excel 计算天差 => 28/10/2018 - 10/4/2018 = 201 这不是我需要的) 计算两个日期之间的差异的依据是,无论月份如何,都应将一个月的天数视为30天。因此,开始和结束日期之间的所有月份为 31 天,应视为 30 天。如果中间有 2 月,也应按 30 天计算。

计算两个给定日期之间的天数的过程:

  1. 起始月份的天数百分比 = 2018 年 4 月 30 日 - 2018 年 10 月 4 日 = 21 天
  2. 2018 年 1 月 5 日至 2018 年 9 月 30 日之间的月份 = 5 个月 = 5 x 30 = 150 天
  3. 上个月天数的小数部分 = 28/10/2018 - 1/10/2018 = 28 天

总天数 = 21 + 150 + 28 = 199 天。

如果A1是开始日期单元格,B1 =结束日期单元格,请在excel中建议如何做。

【问题讨论】:

  • 如果开始或结束日期落在 31 日怎么办?即,Jan 31 to March 31 是多少天,与 Jan 30 to April 1 或 Jan 29 to April 2 相比如何?
  • 如果开始日期是 1 月 31 日,则应视为 1 月的 1 天。 1 月 31 日至 3 月 31 日之间的天数 => 1 月 1 天,2 月 30 天,3 月 30 天 => 1 + 30 + 30 = 61 天
  • 2018 年 4 月 30 日到 2018 年 10 月 4 日之间的天数为 21 天。天数包括在内。所以 + 1 将被添加到差异中。感谢您的快速回复。
  • 您是否有可能在之后的计算中排除其他日子,比如周末?我从来没有见过任何不包括一年 8 天的会计形式。
  • =SUMPRODUCT(--(DAY(ROW(INDIRECT(A2&":"&B2)))<>31)) 我会让你算出 2 月、1 月 31 日和闰年的调整。

标签: excel date


【解决方案1】:

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

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 代码的优雅,但这可能更容易理解。

【讨论】:

  • @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,是的,如果 2 月是月初或月底,那么它应该考虑 2 月的实际天数并计算该月的天数。如果 2 月在整月的开始月和结束月之间,则月费率适用于 2 月,而与该月的天数无关
【解决方案2】:

试试这个,

=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

【讨论】:

  • 这将为Jan 31 to Feb 1 返回4。 (我不知道我为什么还要花时间在这上面))
  • 非常有帮助的 ashleedawg。非常感谢您的努力
  • 在建议之外,我测试了 =SUMPRODUCT(--(DAY(ROW(INDIRECT(A2&":"&B2)))31)) 公式通过处理 2 月完美适合该场景部分月份和整个月份。非常感谢。很好的解决方案。
  • 只有一种情况,Sumproduct 公式不起作用。 2018 年 1 月 1 日至 2018 年 3 月 31 日 - 计算 => 开始月份的天数(1 月 = 1 天)+ 中间月份的整月(整月数 = 2,二月整月 = 1 个月 =视为 30 天 + 3 月整月 = 30 天)= 61 天。 Sumproduct 公式给出 58 天。
【解决方案3】:

在我看来,您的示例有点“古怪”,例如 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

样本输出:

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

【讨论】:

  • 出色的解决方案。非常感谢
【解决方案4】:

DAYS360 公式基于 12 个 30 天的月份逻辑。

【讨论】:

    【解决方案5】:

    简单易行的方法:

    (1)

    =YEARFRAC(start_date,end_date,4)*360
    

    (2)

    =DAYS360(start_date,end_date)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多