我使用Google表格SQL-ish Query函数来汇总我的电子表格中的数据。这种情况多年来一直运作良好,虽然进展缓慢。
今天,我遇到了一些问题 - 特别是有些人将源数据中的日期与TODAY()
进行比较。
为了演示,这是我用来重现假数据问题的link to a shared spreadsheet。
编辑:示例已根据AdamL的建议进行了更新。
源数据的范围为A1:D6
,其中包含“序列号”,“类型”,“位置”和“保修到期”列。最后一列是日期。
A9
中的此功能总结了所有数据:
=query(A1:D6,"select B, count(A) group by B pivot C")
......就像这样:
这就是事情。如果我尝试使用WHERE
和DATE()
进行过滤,则查询似乎完全崩溃了。我想要的是一个看起来像上面的表,但只包括过去在D
列中有日期的数据行。
=query(A1:D6,"select B, count(A) where D < now() group by B pivot C")
如果我将过滤器更改为不涉及日期的内容,我会得到预期的输出:
如何让我得到我想要的摘要?
答案 0 :(得分:3)
now()scalar function返回日期时间值,您在源数据中有日期值。不幸的是,两者之间的比较将失败。解决方法是将now()转换为日期值:
=QUERY(A1:D6;"select B, count(A) where D < toDate(now()) group by B pivot C")
顺便说一下,QUERY函数有一个限制(bug?),now()标量函数不一定(必然)在电子表格的时区中运行,似乎没有任何办法修改此行为。我相信now()标量函数将始终返回太平洋夏令时(例如美国西海岸)的当前时间。所以对我来说,现在在澳大利亚布里斯班,在QUERY select子句中使用的toDate(now())返回昨天的日期。
更安全的选择是使用电子表格函数生成今天的日期,并将其连接到QUERY子句中:
=QUERY(A1:D6;"select B, count(A) where D < date '"&TEXT(GoogleClock();"yyyy-MM-dd")&"' group by B pivot C")