Excel - 计算两个日期之间每个月的天数(两个日期都可用)

Excel - count days in each month between two dates (both dates available)

我找到了解决方案,认为分享一下会很好:

所以公式应该是: =((MAX(CT$6-$N8,0)-MAX(EOMONTH(CT$6,-1)-$N8,0))-(MAX(CT$6-$O8,0)-MAX(EOMONTH(CT$6 ,-1)-$O8,0))+(EOMONTH(CT$6,0)=EOMONTH($N8,0)))*1

:)

我正在尝试编写一个 excel 公式,该公式可以拖过一行单元格以给出两个指定日期之间每个月的天数。例如:

我尝试使用来自同一网站的 if 和求和乘积公式,但出于某种原因,它无法识别上个月的日期。想知道是否有人可以帮助解释这个公式的作用以及如何更正它。

=IFERROR(IF(AND(CS$6>=$M9,CS$6<=$N9),SUMPRODUCT(--(MONTH(ROW(INDIRECT($M9&":"&IF($N9="" ,TODAY(),$N9))))=MONTH(CS$6))),),"")

一个可能的解决方案是使用 MIN 和 MAX 函数比较日期,如下所示:

=IF(MIN($B2+1,D)-MAX($A2,C)<0,"",MIN($B2+1,D)-MAX($A2,C))

screenshot

此解决方案使用月份开始日期(例如,2021 年 2 月 1 日),但可以改为使用月份结束日期(例如,2021 年 2 月 28 日)。

我们的想法是,您将完成日期或月末日期中较晚的日期减去开始日期或月开始日期中的较小者。对于第一个月和最后一个月,此 returns 是该范围内的天数,包括第一天和最后一天。对于第一个月和最后一个月之间的所有月份,它 return 是该月的天数。

结束日期的最小值 +1 似乎有点违反直觉,但有必要在计数中包括第一天和最后一天。没有它,您将在 2022 年 3 月得到 14 天而不是 15 天。

“如果小于零”函数使它 return 在 dat 范围之外的任何月份为空白(如果您愿意,也可以为零)。

此解决方案未按月汇总(例如,2021 年 2 月 19 天加上 2022 年 28 天,二月总天数为 47 天),但这与您提供的示例一致。评论还表明你也想考虑年份。

第二次修订 (R2)

  • 更新了工作簿 link 以捕获固定的列标题
  • 方程式/公式还包括静态视图

根据所跨越的年份,R2 代表一个不太有利的结果 space(将需要更多列)。在这种情况下,匹配堆叠视图所需的附加列数约为 100 (!!)。

第一修订版 (R1) 等 基于@Charlotte.Sarah.Smith 反馈

  • 每个月的天数比应有的少 1 天 - 这已经 更正(在两个屏幕截图中,linked sheet, 和相关方程)
  • 还展示了 一些示例 illustrations/visual 表示,may/not 感兴趣(包含在 linked sheet 中也是)

假设我们想通过堆叠 的日期来扩展@Will 的解决方案,以便列标题可以根据不同的开始日期(而不是恰好出现的第一个开始日期)...

例如,如果下一行包含日期范围 'start = 10/02/16' 到 'end = 15/03/19' - 您会发现跨越 Jan-Dec ('16)、Jan-Dec ('17),...直到(包括)第一行的范围(21 年 1 月 - 23 年 3 月)变得笨拙。


通过使用 数据 table(参见 here) you can produce a 'stacked' view of the number of days per month regardless of the year (!) - see screenshot below and link to this [updated/corrected] 工作sheet.

R2截图:


修改

请参阅末尾的 validation/reconciliation 列

*视觉呈现 - 可用于评估趋势等


3D 也很有趣!

1] 红色字体:定义数据构造的第一行 table:以“10/02/2021-15/08/2023”格式输入日期范围

单元格 E3 eqn(向右拖动):

=IFERROR(IF($A3>EDATE(E,1),0,MAX(,IFERROR(IF(MIN($B3,MIN(EDATE(E,1),$B3))=E-1,0,MIN($B3,MIN(EDATE(E,1),$B3))),"")-MAX($A3,E))),0)

(与我们之前看到的类似)

2] Table 红色字体下方:在 A、B 列中输入任何开始日期(作为常规日期,例如 dd/mm/yyyy)< 结束日期(同样为常规日期)作为 desired/req.


数据Table

3] 数据 Table(列数据):在单元格 c4 中输入以下内容(根据需要向下拖动)

=TEXT(A4,"dd/mm/yyyy")&"-"&TEXT(B4,"dd/mm/yyyy")

4] 数据 Table(突出显示单元格 c3:d42,插入数据 table,select blank/empty 单元格 'row input' 和 c2 'column input')

数据table应该'come to life'(计算sheet,shift + F9)否则

FilterXML

5] 用分隔符 '|' 拆分结果使用 FilterXML 如下(单元格 E4,只向下拖动,不向右拖动):

=IFERROR(TRANSPOSE(FILTERXML("<AllText><Num>"&SUBSTITUTE(LEFT(MID(D4,2,LEN(D4)-1),LEN(MID(D4,2,LEN(D4)-1))-1),"|","</Num><Num>")&"</Num></AllText>","//Num")),"")

验证

注意检查栏:日期差异 = table 中的天数总和(默认单元格颜色为红色):

修订版 2

这是上述静态版本的公式(即没有按年堆叠,相反,headers 列中的每个日期都是不同的重新计算)- 它已经在红色字体行中可用(! !)

=IFERROR(IF($A3>EDATE(C,1),0,MAX(,IFERROR(IF(MIN($B3,MIN(EDATE(C,1),$B3))=C-1,0,MIN($B3,MIN(EDATE(C,1),$B3))),"")-MAX($A3,C))),0)

中提琴!