Время, затраченное на доступ с использованием записи выше

#sql #vba #ms-access #macros

#sql #vba #ms-access #макросы

Вопрос:

     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
  

Это довольно просто, если поля находятся в одной записи, но у меня возникают трудности с использованием приведенной выше информации для генерации прошедшего времени. Любое руководство будет большой помощью.

Спасибо!

Ответ №1:

В других системах СУБД извлечение значений либо из предыдущей строки, либо из следующей строки выполняется с помощью функций LAG или LEAD . Access не поддерживает эти функции, но вы можете выполнить то же самое с помощью подзапросов. Смотрите пример SQL ниже, в котором я предположил, что имя вашей таблицы — «TableName».

Вы не указали единицу, в которой вы хотели бы отобразить прошедшее время, или следует ли сравнивать каждую строку с предыдущей строкой или со следующей строкой. Итак, здесь выполняются оба сравнения, и прошедшее время отображается в секундах.

 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
;
  

Пожалуйста, обратите внимание, что, хотя в вашем вопросе упоминалось сравнение только значений времени, этот SQL фактически сравнивает полные значения даты / времени (т. Е. DStamp столбец). Таким образом, ваши данные будут точными, даже если дата меняется между строками.

Ответ №2:

Это не так сложно:

 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