ms-access - 计算查询中事件时间戳之间的时间差

标签 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 小时,因此我应该能够了解设备在轮类期间执行每项事件所花费的时间。

在上面的示例中,设备在 00:01:00 处于“START_SHIFT”状态,在 06:08:26 处于“DELAY_WAIT_PIT”状态,依此类推。然后,我将构建所选期间的状态条目的唯一列表,并对每个状态的总时间进行求和以获得轮类摘要。

最佳答案

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

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 表达式将不合适。这是一个即时窗口 session ,它说明了问题......

' 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 。他在标题为获取另一条记录中的值的部分中讨论了相关子查询。

关于ms-access - 计算查询中事件时间戳之间的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20339890/

相关文章:

java - 将选择的日期而不是当前日期获取到 JDBC

vba - Access 2013/2016不支持treeview控件,报错 "User defined type not defined"

mysql - 尝试创建一个 Access 2013 查询,该查询选择上一年 9 月 1 日到当年 8 月 31 日之间的日期

vb.net - '=' 在 SQL 语句中无法识别

java - 我们可以用java操作ms access内置查询吗

ms-access - 您想保存对表单设计的更改吗

c# - 更新 Access 表中的记录

python - Pandas to_datetime 在非美国日期上的行为不一致

python - Pandas 数据框按日期排序

vba - 单击错误 : "occurred while Microsoft Access was communicating with the OLE Server or ActiveX Control"