计算查询中活动时间戳之间的时间差

时间:2013-12-02 23:22:41

标签: ms-access datetime ms-access-2013

我是Access的新手,无法解决应该(我希望)一个简单的问题 - 想想我可能会通过Excel护目镜来看待它。

我有一个名为importedData的表,我每天都会导入一个日志文件(并不奇怪)。此日志文件来自某些采矿设备上的简单数据记录应用程序,实际上它为当前活动更改为新活动的点保存了timestampstatus

数据样本如下所示:

dbScreenGrab

然后使用查询过滤此信息,以定义我想要查看信息的范围,例如从29/11/2013 06:00:00 AM到29/11/2013 06:00:00 PM

现在的目的是获取status条目timestamp并获取它与查询结果后续行中的记录之间的时差。当设备工作12小时后,我应该能够建立一个图片,说明设备在该班次中每次活动花费的时间。

在上面的例子中,设备的状态为“START_SHIFT”,时间为00:01:00,状态为“DELAY_WAIT_PIT”,时间为06:08:26,等等。然后,我将为所选时段建立一个唯一的状态条目列表,并将每个状态的总时间相加以获得我的班次摘要。

1 个答案:

答案 0 :(得分:3)

您可以使用相关子查询来获取每行的下一个timestamp

SELECT
    i.status,
    i.timestamp,
    (
        SELECT Min([timestamp])
        FROM importedData
        WHERE [timestamp] > i.timestamp
    ) AS next_timestamp
FROM importedData AS i
WHERE i.timestamp BETWEEN #2013-11-29 06:00:00#
    AND #2013-11-29 18:00:00#;

然后,您可以将该查询用作另一个查询中的子查询,您可以在其中计算timestampnext_timestamp之间的持续时间。然后在您GROUP BY status的第三个中使用整个新查询作为子查询,并计算每个状态的总持续时间。

这是我在Access 2007中测试的版本...

SELECT
    sub2.status,
    Format(Sum(Nz(sub2.duration,0)), 'hh:nn:ss') AS SumOfduration
FROM
    (
        SELECT
            sub1.status,
            (sub1.next_timestamp - sub1.timestamp) AS duration
        FROM
            (
                SELECT
                    i.status,
                    i.timestamp,
                    (
                        SELECT Min([timestamp])
                        FROM importedData
                        WHERE [timestamp] > i.timestamp
                    ) AS next_timestamp
                FROM importedData AS i
                WHERE i.timestamp BETWEEN #2013-11-29 06:00:00#
                    AND #2013-11-29 18:00:00#
            ) AS sub1
    )  AS sub2
GROUP BY sub2.status;

如果遇到麻烦或需要修改它,请打破最里面的子查询 sub1 ,并自行测试。然后对 sub2 执行相同的操作。我怀疑你会想要更改WHERE子句以使用参数而不是硬编码时间。

请注意,如果您的持续时间超过24小时,则查询Format表达式将不合适。这是一个立即窗口会话,说明了问题......

' duration greater than one day:
? #2013-11-30 02:00# - #2013-11-29 01:00#
 1.04166666667152 
' this Format() makes the 25 hr. duration appear as 1 hr.:
? Format(#2013-11-30 02:00# - #2013-11-29 01:00#, "hh:nn:ss")
01:00:00

但是,如果您只处理12小时的数据。转变,这应该不是问题。如果您需要分析超过24小时的数据,请记住这一点。

如果不熟悉子查询,请参阅Allen Browne的页面:Subquery basics。他在标题为获取另一条记录中的值的部分中讨论了相关子查询。