#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