【问题标题】:Find total duration of many overlapping times查找许多重叠时间的总持续时间
【发布时间】:2017-10-17 22:51:17
【问题描述】:

我有一份员工考勤表的日期和时间列表。时间从 F 列开始,到 G 列结束。有时项目的时间会重叠。员工不会因重叠项目而获得报酬,但我们需要单独跟踪每个项目。我希望能够查看 E、F 和 G 列并找到任何重叠的项目,并返回单个时间条目。在下面的示例中,请注意第 1 行不与其他行重叠,但在第 2-6 行中有一系列重叠的条目。它们不一定都重叠,而更像是一条“链条”。我想写一个公式(不是脚本)来解决这个问题。

+---+------------+------------+----------+
|   |     E      |       F    |    G     |
+---+------------+------------+----------+
| 1 | 10/11/2017 | 12:30 PM   |  1:00 PM |
| 2 | 10/11/2017 |  1:00 PM   |  3:00 PM |
| 3 | 10/11/2017 |  2:15 PM   |  6:45 PM |
| 4 | 10/11/2017 |  2:30 PM   |  3:00 PM |
| 5 | 10/11/2017 |  2:15 PM   |  6:45 PM |
| 6 | 10/11/2017 |  3:00 PM   |  6:45 PM |
+---+------------+------------+----------+

我想评估这些列并返回重叠系列最后一行上每个“链”的总持续时间。在下面的示例中,我们将其放在 H 列中。它会为从第 2 行开始到第 6 行(下午 1 点到 6 点 45 分)结束的系列找到 5.75 小时。

+---+------------+------------+----------+------------+
|   |     E      |       F    |    G     |      H     |
+---+------------+------------+----------+------------+
| 1 | 10/11/2017 | 12:30 PM   |  1:00 PM |    0.5     |
| 2 | 10/11/2017 |  1:00 PM   |  3:00 PM |  overlap   |
| 3 | 10/11/2017 |  2:15 PM   |  6:45 PM |  overlap   |
| 4 | 10/11/2017 |  2:30 PM   |  3:00 PM |  overlap   |
| 5 | 10/11/2017 |  2:15 PM   |  6:45 PM |  overlap   |
| 6 | 10/11/2017 |  3:00 PM   |  6:45 PM |   5.75     |
+---+------------+------------+----------+------------+

我尝试过编写查询,但总是发现自己回到了开头。如果有人有建议,我很想知道!提前谢谢你。

尼尔

【问题讨论】:

    标签: google-sheets formula overlap


    【解决方案1】:

    我的解决方案

    为了解决这个问题,我需要 2 个额外的列:

    第 1 步。返回“重叠”或“确定”

    当一端在另一端时,两条线重叠:

    我做了一个query 公式来检查这个:

    =if(QUERY(ArrayFormula({value(E1:E+F1:F),VALUE(E1:E+G1:G)}), "select count(Col1) where Col1 < "&value(G1+E1-1/10^4)&" and Col2 > "&value(F1+E1+1/10^4)&" label Count(Col1) ''",0)>1,"overlap","ok")

    向下拖动公式。结果是列:

    ok
    overlap
    overlap
    overlap
    overlap
    ok
    ok
    overlap
    overlap
    overlap
    overlap
    ok
    

    在公式中:

    • value 用于比较数字。必须比较每个部分:日期 + 时间。
    • 使用 -1/10^4+1/10^4 是因为 query 不精确

    步骤 2. 获取时间链

    这部分很棘手。我的解决方案只有在数据按照示例中的排序时才有效。

    在单元格I1 中输入 1。在单元格I2 中输入公式:

    =if(or(and(H1=H2,H2="overlap"),and(H2="ok",H1="overlap")),I1,I1+1)

    向下拖动公式。结果是列:

    1
    2
    2
    2
    2
    2
    3
    4
    4
    4
    4
    4
    

    步骤 3。获取时长

    在 J4 中粘贴并复制公式:

    =if(H1="ok", round(QUERY(ArrayFormula({value(E:E+F:F),VALUE(E:E+G:G),I:I}), "select max(Col2) - min(Col1) where Col3 = "&I1 &" label max(Col2) - min(Col1) ''")*24,2),"")

    查询按组获取最大持续时间,在步骤 2 中找到。

    • 使用 round 是因为 query 不精确

    【讨论】:

    • 太棒了!谢谢马克斯。您的解决方案不仅有效,而且我很欣赏您提供的解释,因此我可以理解它是如何工作的。非常感谢!
    猜你喜欢
    • 2023-03-31
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多