从日期范围计算特定月份的天数。谷歌表格

问题描述 投票:0回答:4

我正在尝试制作一个谷歌表格,它会自动计算设备每月维修的天数。

我需要它来计算列中的日期并将结果发布在不同的列行中,因为会有一个列表不断有新条目

例如:

Device| start date | end date.

Laptop| 8/29/2021 | 9/10/2021. 2 days in August,  10 days in September 

期望的结果将在第 1 个月的 2 列 1 中,第 2 个月的第 2 列

我设法找到了这个公式:

=ArrayFormula(query({EOMONTH(row(indirect("A"&A2):indirect("A"&B2)),0),row(indirect("A"&A2):indirect("A"&B2))},"Select Col1,Count(Col2) group by Col1 label Col1 'Month', count(Col2)'Days in Month' format Col1 'MMMM-YYYY' "))

但我不能在列表表中使用它。任何想法将不胜感激

google-sheets google-sheets-formula formula transpose flatten
4个回答
1
投票

尝试:

=ARRAYFORMULA(SPLIT(FLATTEN(QUERY(TRANSPOSE(QUERY(QUERY(IFERROR(SPLIT(FLATTEN(IF((A1:A="")+(B1:B=""),,
 IF(C1:C-B1:B>=SEQUENCE(1, MAX(C1:C-B1:B), ), 
 ROW(A1:A)&"×"&TEXT((B1:B)+SEQUENCE(1, MAX(C1:C-B1:B), ), "mm"), ))), "×")), 
 "select count(Col1) where Col2 is not null group by Col1 pivot Col2"), "offset 1", 0)),,9^9)), " "))

演示电子表格


1
投票

也许最简单的做法是使用

sequence()
枚举日期,仅使用
text()
将它们格式化为月份名称,并使用
query()
聚合数据,然后进行一些字符串操作以将数据拆分为列,例如这个:

=arrayformula( 
  if( 
    isdate(B2) * isdate(C2), 
    split( 
      regexreplace( 
        join( 
          "", 
          flatten( 
            query( 
              " days in " & text(sequence(C2 - B2 + 1, 1, B2), "mmµmmmm→"), 
              "select count(Col1), Col1 group by Col1 label count(Col1) '' ", 
              0 
            ) 
          )  
        ), 
        "\d+µ", "" 
      ), 
      "→" 
    ), 
    iferror(1/0) 
  ) 
)

这个公式将处理跨越多个月的日期,给出与期间中的月份一样多的列。


1
投票

如果你每个月可以有一个公式,那么这个就可以了。

您的用例仅调用两个月。如果维修可以跨越 3 个月,您希望如何显示?

第一个输出列

在您的示例中,B 列是开始日期,D 列是输出:

=ARRAYFORMULA(
  IF(Month(B2:B) = Month(C2:C), 
    C2:C - B2:B + 1
      & IF(C2:C - B2:B +1 = 1, " day in ", " days in ") 
      & Text(B2:B, "mmmm"),
    EOMONTH(B2:B, 0)-B2:B + 1 
      & IF(EOMONTH(B2:B, 0)-B2:B+1 = 1, " day in ", " days in ") 
      & Text(B2:B, "mmmm")
  )
)

解释 - 首先我们检查开始日期和结束日期是否在同一个月。如果是,它是差值 + 1、您的文本和月份的串联,如下所示。

EOMONTH()
为您提供所选月份的最后日期。所以这通过获取月份的最后一天,减去开始日期得到该月的天数来工作。

要获取月份的文本单词值,您可以使用

TEXT()
函数将数据转换为月份。 'mmmm' 给出 August,'mmm' 给出 Aug,'mm' 返回月份数。 中间的 if 语句纠正了 1 天和 3 天的语法差异。

然后将这些与“days in”文本连接在一起,并将其包装在

ARRAYFORMULA()
.

第二个输出列

与第一个类似,但数学有点不同。

=Arrayformula(
  IF(Month(B2:B) = Month(C2:C),
   "", 
   Text(C2:C, "dd") 
    & IF( Text(C2:C, "dd") = 1, " day in ", " days in ") 
    & Text(C2:C, "mmmm")
   )
)

解释 - 首先我们检查开始和结束是否在同一个月,如果是,那么这个月是空白的。如果你宁愿有 0 天,你可以调整以表明这一点。

在这里你可以得到这个月的天数。由于九月的天数等于日期。因此,您使用 TEXT() 和 'dd' 获取月数,并将其与您的文本和月份的文本值连接起来。


0
投票

这是我用过的。 A32 包含您感兴趣的月份以及当您将公式复制到其他月份时会发生变化的月份。在我的例子中,我需要的是适用于每个范围内指定月份天数的费率,并且该费率与相关范围相关联。因此,对于每个范围,如果它与行中的月份匹配,我需要聚合产品并吐出该月的最终聚合值:

=SUMPRODUCT(利率, 国际金融中心( MONTH(A32)EndDates,EndDates),StartDates)+IF(EndDates>EOMONTH(A32,0),1,0), 月(A32)>月(开始日期),如果(月(A32)<=MONTH(EndDates), DAYS(IFS(EOMONTH(A32,0)=EndDates, EndDates,EOMONTH(A32,0)结束日期,结束日期), IFS(开始日期=A32,开始日期,开始日期A32,开始日期) )+IF(结束日期>EOMONTH(A32,0),1,0),0) ) )

© www.soinside.com 2019 - 2024. All rights reserved.