使用上面的记录

时间:2016-10-19 13:00:38

标签: sql vba ms-access macros

    M   Qty TStamp  DStamp
VF6 1   11:34:38 AM 8/11/2016 11:34:38 AM
VF6 1   1:06:01 PM  8/11/2016 1:06:01 PM
VF6 1   2:16:30 PM  8/11/2016 2:16:30 PM
VF6 1   3:30:20 PM  8/11/2016 3:30:20 PM
VF6 1   4:03:48 PM  8/11/2016 4:03:48 PM
VF6 1   4:52:23 PM  8/11/2016 4:52:23 PM
VF6 1   11:06:31 PM 8/11/2016 11:06:31 PM
VF6 1   12:23:23 AM 8/12/2016 12:23:23 AM
VF6 1   1:23:26 AM  8/12/2016 1:23:26 AM
VF6 1   2:43:20 AM  8/12/2016 2:43:20 AM
VF6 1   3:40:12 AM  8/12/2016 3:40:12 AM
VF6 1   4:40:09 AM  8/12/2016 4:40:09 AM
VF6 1   5:38:44 AM  8/12/2016 5:38:44 AM
VF6 1   6:52:05 AM  8/12/2016 6:52:05 AM
VF6 1   8:00:43 AM  8/12/2016 8:00:43 AM

以上是一些示例数据。 我想要获取记录之间的经过时间。例如,我想知道从以下时间开始的经过时间:

11:34:38 AM and 1:06:01 PM

如果字段在同一记录中,则相当简单,但我在使用上述信息生成经过的时间时遇到困难。任何指导都将是一个很大的帮助。

谢谢!

2 个答案:

答案 0 :(得分:0)

在其他DBMS系统中,从前一行或下一行检索值是通过_1LAG函数完成的。 Access不支持这些功能,但您可以使用子查询完成相同的操作。请参阅下面的示例SQL,其中我假设您的表名是“TableName”。

您没有提及要显示已用时间的单位,或者是否应将每一行与上一行或下一行进行比较。所以在这里,两个比较都完成了,并且经过的时间以秒为单位显示。

LEAD

请注意,即使您的问题提到仅比较时间值,此SQL实际上会比较完整的日期/时间值(即SELECT t.M , t.[Qty TStamp] , t.DStamp , (SELECT TOP 1 t1.DStamp FROM TableName t1 WHERE t1.DStamp < t.DStamp ORDER BY t1.DStamp DESC ) AS PreviousDStamp , (SELECT TOP 1 t2.DStamp FROM TableName t2 WHERE t2.DStamp > t.DStamp ORDER BY t2.DStamp ) AS NextDStamp , DateDiff("s", PreviousDStamp, t.DStamp) AS Seconds_From_Previous , DateDiff("s", t.DStamp, NextDStamp) AS Seconds_To_Next FROM TableName t ORDER BY t.DStamp ; 列)。这样,即使日期在行之间发生变化,您的数据也会准确无误。

答案 1 :(得分:0)

这并不难:

Select *,
    (Select Max(T.DStamp)
    From YourTable As T
    Where T.DStamp < YourTable.DStamp) As LastDStamp
From YourTable

或者相反:

Select *,
    (Select Min(T.DStamp)
    From YourTable As T
    Where T.DStamp > YourTable.DStamp) As NextDStamp
From YourTable

如果您只需要时间部分:

Select *,
    (Select TimeValue(Max(T.DStamp))
    From YourTable As T
    Where T.DStamp < YourTable.DStamp) As LastTStamp
From YourTable