Найти разницу между entryTime и exitTime из базы данных MS Access

57
5

У меня есть проблема в получении разницы между EntryTime и ExitTime. У меня есть таблица с именем IOData, и я работаю над столбцом IOTime.
Формат таблицы:


HolderName        IODate        IOTime       IOGateName         IOStatus 
Dinesh Kumar 2010/07/09 00:50:05 Basement(I/O) Entry
Dinesh Kumar 2010/07/09 00:52:55 Basement(I/O) Exit
Dinesh Kumar 2010/07/09 01:00:07 Basement(I/O) Entry
Dinesh Kumar 2010/07/09 01:35:42 Basement(I/O) Exit
Dinesh Kumar 2010/07/09 01:36:37 Ground Floor(I/O) Entry
Dinesh Kumar 2010/07/09 01:37:02 Ground Floor(I/O) Exit
Dinesh Kumar 2010/07/09 01:46:04 Ground Floor(I/O) Entry
Dinesh Kumar 2010/07/09 01:46:29 Ground Floor(I/O) Exit
Dinesh Kumar 2010/07/09 01:47:02 Basement(I/O) Entry
Dinesh Kumar 2010/07/09 04:09:11 Basement(I/O) Exit
Dinesh Kumar 2010/07/09 04:09:35 Ground Floor(I/O) Entry
Dinesh Kumar 2010/07/09 04:11:27 Ground Floor(I/O) Exit
Dinesh Kumar 2010/07/09 04:11:54 Basement(I/O) Entry
Dinesh Kumar 2010/07/09 05:10:28 Ground Floor(I/O) Entry
Dinesh Kumar 2010/07/09 05:18:12 Main Door(I/O) Exit
Dinesh Kumar 2010/07/09 17:55:16 Main Door(I/O) Entry
Dinesh Kumar 2010/07/09 17:56:10 Ground Floor(I/O) Entry

Проблема заключается в том, что у меня есть один столбец для определения разницы во времени. Как я могу преодолеть эту проблему.
Если я сломаю IOStatus в двух столбцах (Entry and Exit), тогда запись состояния может быть меньше, чем exit или vice ver
Любое предложение будет оценено.

Спасибо заранее

спросил(а) 2011-03-03T11:44:00+03:00 9 лет, 6 месяцев назад
1
Решение
58

Я бы создал представление.


create view suspicious_person_movements as
select IO.holder_name,
cast(IO.io_date || ' ' || IO.io_time as timestamp) as io_timestamp,
-- Concatenate most recent earlier date and time, and cast to timestamp
cast((select max(io_date)
from iodata
where holder_name = IO.holder_name
and io_date <= IO.io_date)
|| ' ' ||
(select max(io_time)
from iodata
where holder_name = IO.holder_name
and io_date <= IO.io_date
and io_time < IO.io_time) as timestamp) as previous_timestamp,
-- Subtract the timestamps to get elapsed_time
cast(IO.io_date || ' ' || IO.io_time as timestamp) -
cast((select max(io_date)
from iodata
where holder_name = IO.holder_name
and io_date <= IO.io_date) || ' ' ||
(select max(io_time)
from iodata
where holder_name = IO.holder_name
and io_date <= IO.io_date
and io_time < IO.io_time) as timestamp) as elapsed_time,
IO.io_gate_name,
IO.io_status
from iodata IO
order by holder_name, io_date, io_time -- Better to sort in the client?

Затем я могу просто выбрать все строки из suspicious_person_movements. (Легко отредактировано для уменьшения горизонтальной прокрутки.)


Dinesh 2010-07-09 00:50:05                                    Basement(I/O)   Entry
Dinesh 2010-07-09 00:52:55 2010-07-09 00:50:05 00:02:50 Basement(I/O) Exit
Dinesh 2010-07-09 01:00:07 2010-07-09 00:52:55 00:07:12 Basement(I/O) Entry
Dinesh 2010-07-09 01:35:42 2010-07-09 01:00:07 00:35:35 Basement(I/O) Exit
Dinesh 2010-07-09 01:36:37 2010-07-09 01:35:42 00:00:55 Ground Fl(I/O) Entry
Dinesh 2010-07-09 01:37:02 2010-07-09 01:36:37 00:00:25 Ground Fl(I/O) Exit
Dinesh 2010-07-09 01:46:04 2010-07-09 01:37:02 00:09:02 Ground Fl(I/O) Entry
Dinesh 2010-07-09 01:46:29 2010-07-09 01:46:04 00:00:25 Ground Fl(I/O) Exit
Dinesh 2010-07-09 01:47:02 2010-07-09 01:46:29 00:00:33 Basement(I/O) Entry
Dinesh 2010-07-09 04:09:11 2010-07-09 01:47:02 02:22:09 Basement(I/O) Exit
Dinesh 2010-07-09 04:09:35 2010-07-09 04:09:11 00:00:24 Ground Fl(I/O) Entry
Dinesh 2010-07-09 04:11:27 2010-07-09 04:09:35 00:01:52 Ground Fl(I/O) Exit
Dinesh 2010-07-09 04:11:54 2010-07-09 04:11:27 00:00:27 Basement(I/O) Entry
Dinesh 2010-07-09 05:10:28 2010-07-09 04:11:54 00:58:34 Ground Fl(I/O) Entry
Dinesh 2010-07-09 05:18:12 2010-07-09 05:10:28 00:07:44 Main Door(I/O) Exit
Dinesh 2010-07-09 17:55:16 2010-07-09 05:18:12 12:37:04 Main Door(I/O) Entry
Dinesh 2010-07-09 17:56:10 2010-07-09 17:55:16 00:00:54 Ground Fl(I/O) Entry

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

Для Access вы должны использовать запрос, похожий на этот, который я скопировал из представления SQL.


SELECT IO.holder_name
, [io_date] & " " & [io_time] AS io_timestamp
, (select max(io_date)
from iodata
where holder_name = IO.holder_name
and io_date <= IO.io_date)
& " " &
(select max(io_time)
from iodata
where holder_name = IO.holder_name
and io_date <= IO.io_date
and io_time < IO.io_time) AS previous_timestamp
, DateDiff("n",[previous_timestamp],[io_timestamp]) AS elapsed_minutes
, IO.io_gate_name
, IO.io_status
FROM iodata AS IO
ORDER BY IO.holder_name, IO.io_date, IO.io_time;

Я взял несколько ярлыков, потому что я на работе. Я показываю прошедшие минуты вместо прошедшего времени в формате "00:00:00". Я игнорирую нулевую метку времени для первой строки.

ответил(а) 2011-03-03T15:15:00+03:00 9 лет, 6 месяцев назад
58

Если возможно (и я понимаю, что может быть слишком поздно делать это), я бы рекомендовал перепроектировать вашу схему. Кажется, что имеет смысл следующее:


HolderName      IOGateName        EnterDT              ExitDT 
Dinesh Kumar Basement(I/O) 2010/07/09 00:50:05 2010/07/09 00:52:55
Dinesh Kumar Basement(I/O) 2010/07/09 01:00:07 2010/07/09 01:35:42
Dinesh Kumar Ground Floor(I/O) 2010/07/09 01:36:37 2010/07/09 01:37:02

Обратите внимание, что, хотя это может выглядеть как меньше данных, вы фактически не теряете информацию... просто нормализуете свою структуру.

Это займет немного внимания со стороны ввода данных. Например, вам нужно сделать UPDATE в дополнение к INSERT. И, возможно, вам придется обрабатывать вложенные места, если это возможно (например, чистая комната внутри лаборатории, где вход/выход для чистой комнаты будет проходить между входами и выходами для самой лаборатории).


Все эти вещи все еще могут быть обработаны с помощью этого дизайна, и отчетность будет значительно упрощена и более эффективна.


Ответ на ваш первоначальный вопрос о продолжительности, проведенной в месте, теперь тривиален.

ответил(а) 2011-03-04T01:17:00+03:00 9 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема