从日期范围计算特定月份的天数。谷歌表格
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 addyyyy
如果你也想区分年份:i.stack.imgur.com/HnAzH.png以上是关于从日期范围计算特定月份的天数。谷歌表格的主要内容,如果未能解决你的问题,请参考以下文章