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

Posted

技术标签:

【中文标题】从日期范围计算特定月份的天数。谷歌表格【英文标题】:Counting the number of days in specific months from date range. Google sheets 【发布时间】:2021-11-12 11:25:19 【问题描述】:

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

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

例如:

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' "))

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

【问题讨论】:

欢迎来到Stack Overflow。 【参考方案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) 
  ) 
)

此公式将处理跨越多个月的日期,给出的列数与该期间的月数一样多。

【讨论】:

目前我正在努力制作一个很长的 IF 公式。但我的大脑不太好。我对数组和查询不太熟悉。所以我真的看不出它如何与你的想法一起工作。我非常感谢您的意见。你的解决方案看起来比我的猴子大脑能够争夺的要好得多。 考虑共享一个可公开编辑的sample spreadsheet,其中包含逼真的数据。 一个好主意。当我在电脑上时,我将能够链接它【参考方案2】:

如果您可以为每个月制定一个公式,那么这将起作用。

您的用例只需要两个月。如果维修可以跨越 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' 给出八月,'mmm' 给出八月,'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' 获取月份的编号,并将其与您的文本和月份的文本值连接起来。

【讨论】:

第一个公式中存在一次性错误——如果开始日期是 8 月 31 日,它将得到“8 月 0 天”。第二个公式将仅报告最后一个月的天数,忽略跨越三个月或更长时间的其他月份。 好点。让我解决。 OP 只要求两列两个月。如果有 3 个月,我们需要知道他希望如何显示。全部连接到第二列,第三列等? 在这里。我只想计算设备维修天数的天数,这样我就可以计算该月维修的总天数。我需要每个月自动完成。稍后我会尝试提供一个测试文件【参考方案3】:

尝试:

=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)), " "))

demo spreadsheet

【讨论】:

它工作。我真的很爱你。上帝祝福你。我花了很多时间,我一直在死胡同 @Danion add yyyy 如果你也想区分年份:i.stack.imgur.com/HnAzH.png

以上是关于从日期范围计算特定月份的天数。谷歌表格的主要内容,如果未能解决你的问题,请参考以下文章

如何用excel计算月份和天数?

android里 怎么计算日期差

将谷歌表格中的特定范围插入到 MYSQL

excel表格怎么算日期天数

excel计算当月天数的公式,是怎么弄的?

如何用PHP+MySQL计算两个日期之间的月份数和其余下的天数?