Google Sheets:能否将QUERY多列结果作为DAYS函数的参数?
简化Google Sheets休假天数计算公式
问题背景
我当前用以下公式计算指定人员在特定时间段内的休假总天数:
=SUM( ARRAYFORMULA( DAYS( QUERY($A$2:$D$100, "SELECT C WHERE A='Dave' AND B >= date '2024-01-01' AND C <= date '2024-01-31'"), QUERY($A$2:$D$100, "SELECT B WHERE A='Dave' AND B >= date '2024-01-01' AND C <= date '2024-01-31'") ) ) )
这个公式需要重复调用两次QUERY,我想简化成仅调用一次QUERY,比如通过DAYS(SOMEFUNCTION(QUERY(SELECT C,B)))的形式,直接把QUERY返回的两列结果分别传入DAYS的两个参数。之前试过TRANSPOSE和ARRAYFORMULA,但没实现预期效果。
解决方案
方法1:用INDEX提取QUERY返回的列
通过INDEX函数分别提取QUERY返回的两列数据,配合ARRAYFORMULA批量计算天数差后求和:
=SUM(ARRAYFORMULA(DAYS(INDEX(QUERY($A$2:$D$100, "SELECT C,B WHERE A='Dave' AND B >= date '2024-01-01' AND C <= date '2024-01-31'"),,1), INDEX(QUERY($A$2:$D$100, "SELECT C,B WHERE A='Dave' AND B >= date '2024-01-01' AND C <= date '2024-01-31'"),,2))))
方法2:用LET函数复用QUERY结果(更简洁)
如果你的Google Sheets支持LET函数,可将QUERY结果存为临时变量,避免重复执行查询,公式可读性更强:
=LET( vacation_data, QUERY($A$2:$D$100, "SELECT C,B WHERE A='Dave' AND B >= date '2024-01-01' AND C <= date '2024-01-31'"), SUM(ARRAYFORMULA(DAYS(INDEX(vacation_data,,1), INDEX(vacation_data,,2)))) )
原理说明
- 单次
QUERY返回**结束日期(C列)和开始日期(B列)**两列数据 INDEX(vacation_data,,1)提取第一列(结束日期),INDEX(vacation_data,,2)提取第二列(开始日期)ARRAYFORMULA让DAYS函数对每一行的日期对自动计算天数差- 最后用
SUM求和得到总休假天数
之前用TRANSPOSE失败,是因为TRANSPOSE会将列转为行,而DAYS需要两个同长度的列数组作为参数,转置后的数据结构不匹配,无法正确批量计算。
内容的提问来源于stack exchange,提问作者Dave Stein
相关产品推荐
相关产品推荐

