【问题标题】:List each month between date range. Google Query列出日期范围之间的每个月。谷歌查询
【发布时间】:2026-01-19 17:00:01
【问题描述】:

我正在寻求帮助解决我一直试图解决几个小时的问题,但徒劳无功。 我正在使用谷歌电子表格上的谷歌查询()。 所以我有这种表(比如说 A1:E3)

Client Bank receipt Start Date End date Value
John #1 14/10/2021 31/10/2021 500
John #2 14/10/2021 31/12/2021 500

为了清楚起见,银行收据是具有开始日期和结束日期的值。因此,银行收据 #2 涵盖了 10 月、11 月和 12 月的 500。 我正在尝试做的是一个按时间顺序排列的表格(列中有月份),它向我显示了 john 在一年中的银行收据覆盖率,以便获得这种结果:

October November December
John Bank receipts 1000 500 500

这是更长查询的第一步,但我需要以这种方式返回数据才能继续。

我试图寻找方法来返回每个月的日期范围,但只发现帖子谈论我无法使用的谷歌脚本。我还尝试使用 SEQUENCE() 似乎可以使用一些技巧,直到我从 2021/12/15 到 2022/03/31 并且由于年份的变化它返回了 14。所以我完全没有解决方案。我确切地说我是使用谷歌查询的新手,所以我可能会错过一些明显的事情。

非常感谢谁可以提供帮助

【问题讨论】:

  • 结束日期总是一个月的最后一天吗?这样会更容易一些。
  • 是的,确实是为了简单起见

标签: google-sheets google-query-language


【解决方案1】:

只是一个相当简单的 2 行 X 3 列演示,您可以在其上构建:

=ArrayFormula(mmult({1,1},if((C2:C3<=eomonth(G2,{0,1,2}))*(D2:D3>=eomonth(G2,{0,1,2})),E2:E3,0)))

稍后会给出更完整的解决方案。


这是公式的更动态的版本

=ArrayFormula(mmult(sequence(1,counta(A2:A),1,0),
if((C2:index(C:C,counta(C:C))<=eomonth(G2,sequence(1,datedif(G2,H2,"M")+1,0)))*
(D2:index(D:D,counta(D:D))>=eomonth(G2,sequence(1,datedif(G2,H2,"M")+1,0))),E2:index(E:E,counta(E:E)),0)))

但它使用相同的原理

(1) 使用带有序列的 eomonth 来制作月末的单行数组(31/10/21、30/11/21、31/12/21 等)

(2) 将这些日期与数据中的日期范围进行比较,以查看每个范围中包含哪些日期,以及它们匹配的位置,生成一个 2d 数组,其中包含月份的金额和数据行下降

(3) 使用 mmult 获取二维数组的列总数(这是获取列总数的标准方法shown here being used in Excel

我使用了一个更简单的公式来计算从 I1 开始的月份

=ArrayFormula(edate(G2,sequence(1,datedif(G2,H2,"M"),0)))

【讨论】:

  • 好的,谢谢,我正在等待更完整的解决方案,因为老实说,这对我来说很难解释。我查找了有关 mmult() 的信息,但不明白你是如何构建它的,还有 eomonth 和 {} 和中间的“*”是我不明白的另一个微妙之处
  • 好的,我知道 {...} 的使用是为了使用数组(绝对值而不是单元格,对吧?)。我也在“翻译”这些公式,因为在欧洲我们有“,”作为小数分隔符,并且必须使用“\”来代替。所以只会增加一点难度
  • 哇,太棒了,谢谢先生!我已经将公式调整为我的语言(意大利语)+欧洲函数的格式,我可以说它工作正常!但现在,对我来说最重要的是了解它为什么起作用。我理解你的解释和公式中的大部分内容(一一),虽然在其他嵌套函数中仍然有一些嵌套函数很难可视化,所以我正在解构它并逐步重建它矿。完成后我会在这里发布,可能需要几天时间。再次感谢您提供的技能、帮助和可用性!
【解决方案2】:

首先感谢所有提示和解决方案,一切正常。 现在我将有一个比我想象的更棘手的步骤。我需要执行此操作,但将返回的值按将出现在行中的标签进行分组,如下所示:

https://i.stack.imgur.com/7Ch9r.png

困难的一点是,由于 array.formula(),我无法执行一个查询,该查询也会像我一开始所想的那样“按”结果进行分组。所以我想我需要将'array.formula()' 应用到好的数据集(由 A、B 等过滤)。虽然我想避免创建 X 数据集,而是想找到一种动态的方法。 我看到你不能在 array.formula() 中使用 query(),但相反的工作。

我很清楚如何使用 query() 来完成,但是 array.formula() 让它变得相当复杂。

我不是要求完成所有工作,也许您可​​以给我一些关于如何构建它的提示?您建议我使用哪些步骤/功能?然后我会自己尝试解决并在此处发布结果。

【讨论】:

  • 请考虑单独提出更多问题。由于此处系统的布局,没有人可以回答您的进一步查询,除非在您的答案的 cmets 中,其中可能会丢失或混乱,并且格式化选项是有限的(这不是 cmets无论如何)。
  • 好的,谢谢