2013-12-02 4 views
2

Я достаточно новичок в доступе и не могу решить, что должно быть (я надеюсь) простая проблема - думаю, я могу смотреть на нее с помощью Excel-очков.Вычисление разницы во времени между временными отметками времени в запросе

У меня есть таблица с именем importedData, в которую я (не так удивительно) импортирую файл журнала каждый день. Этот файл журнала выполнен из простого приложения регистрации данных на каком-либо горнодобывающем оборудовании и по существу он сохраняет timestamp и status для того момента, когда текущая деятельность изменяется на новую активность.

Образец данных выглядит следующим образом:

dbScreenGrab

Эта информация затем фильтруется с помощью запроса для определения диапазона я хочу видеть информацию, скажем, от 29/11/2013 06: 00:00 AM до 29/11/2013 18:00:00 PM

Теперь целью этого является принять status запись timestamp и получить разницу во времени между ней и записью в следующей строке результатов запроса , По мере того, как оборудование работает на 12-часовой смену, я должен был бы построить картину того, сколько времени оборудование тратило на каждую деятельность в течение этой смены.

В приведенном выше примере оборудование было в состоянии «START_SHIFT» для 00:01:00, в статусе «DELAY_WAIT_PIT» для 06:08:26 и так далее. Затем я построил бы уникальный список записей статуса для выбранного периода и суммировал общее время для каждого состояния, чтобы получить сводную сводку.

ответ

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#; 

Затем вы можете использовать этот запрос в качестве подзапроса в другом запросе, в котором вы вычислить время между timestamp и next_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 для использования параметров вместо жестко закодированных времен.

Обратите внимание, что выражение Format не подходит, если продолжительность вашей работы превышает 24 часа. Вот Немедленная сессия окна, которое иллюстрирует проблему ...

' 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 часа.

Если подзапросы незнакомы, см. Страницу Аллена Брауна: Subquery basics. Он обсуждает коррелированные подзапросы в разделе под названием Получите значение в другой записи.

+0

Haha wow, работа сперва попытка.Спасибо, что разобрали его с объяснением, а для ссылки - помогает многое увидеть, как он проходит. Ура! – Jadyn

+0

Я удалил 'CDate()' из выражения 'Format()', потому что это не нужно. Но это незначительное изменение и не должно изменять результаты запроса. – HansUp

Смежные вопросы