MySQL. Как регистрировать разницу времени между изменениями состояния?
Здравствуйте!
Я новичок в программировании и только учусь, по-этому если вопрос будет глупым - Вы уж извините.
Для развития навыков и освоения базы данных, друг подкинул задание. На первый взгляд простое, но коснувшись - попал в тупик.
Суть вот в чем - нужно сделать базу данных оборудования, которая б записывала время вкл и выкл (меняла состояние). Но не просто логировалась, а и выводила между этими временами разницу (промежуток. Общее проработанное время).
Т.е. 1 станок включился в 00:00, выключился в 00:17. (Проработал 17 минут), включился в 00:20 (простоял 3 минуты).... и т.д.
И так на несколько.
Как правильно это осуществить ?
Самый реализуемый способ - на каждый станок вести отдельную таблицу и сравнивать значения, но это как-то неправильно... Станков много(
А больше вариантов в голову не приходит.
Подскажите, пожалуйста.
P.S. Извините, никакого кода не писал, так как писать то по сути и нечего. Я на этапе продумывания структуры базы.
Зачем же городить такой огород ? 2 Таблицы :
1) станок_id, start_time, end_time , duration. (это статистика работы станков)
2) станок_id , название станка, доп инфо если нужно. (это таблица самих станков)
При включении записываем время старта . При выключении записываем время стопа и продолжительность - "вычитаем из стопа старт" :) .
Далее можем легко получить статистику
1) по каждому станку (выборка по ID)
2) По периоду (выборка время старта >= начало нужного периода , время стопа <= конец нужного периода ).
Комбинируя фильтр 1 и 2 получаем статистику для нужного станка за нужный период.
Так в том и загвоздка - я не могу понять как мне в одну таблицу писать время включения и время выключения.
Мое понимание: Включение - пишем строку в базу. Выключение - пишем строку в базу. Получается на каждую операцию - одна строка. Как одновременно записать включение и выключение ? Их можно как-то хранить в буфере от момента включения до момента выключения ?
Основной язык точно не скажу, некое подобие Паскаля.
Необходимо знать id станка. Например у вас есть станки 1, 2 ,3.
Приступаем.
Когда включился станок 1 - вы записали в таблицу (станок_id -1 , start_time - текущее время, end_time - ничего , duration -ничего).
Далее , когда станок 1 выключился - вы (это элементарный запрос в любом языке , если это не visual basic for applications :) ) нашли запись в таблице где ,например,
id = 1 и end_time - ничего. Посчитали разницу между start_time этой записи и текущим временем , получив таким образом duration (продолжительность). Обновили найденную запись. Теперь в этой записи у вас заполнены все поля ( станок_id -1 , start_time - время старта которое мы записали при старте, end_time - время завершения , которое мы записали при выключении , duration -продолжительность, которую мы посчитали и записали при выключении).
Запустился другой (#2 или #3) или тот же станок (#1) - все повторяется.
Можно сделать и другую структуру таблицы, но мне кажется, что эта наиболее простая и понятная.
Это в таблице один станок. Тут более. менее понятно. Но когда их десятки и меняются хаотично - я не могу понять как промониторить.
Т.е.
Станок_id действие_id время.
1_станок включился 00:00
2_станок включился 00:00
3_станок включился 00:00
1_станок выключился 00:17
1_станок выключился 00:21
1_станок включился 00:22
3_станок выключился 00:05
И т.д.
Как мне сказать машине - найди в списке предыдущую запись с таким ид станка и залей ее себе же в строку ? (Как такой запрос сформировать просто - я понимаю, но как, чтоб он записывал в базу показания - не понимаю)
Для правильного вопроса надо знать половину ответа
Если нужен полный лог, то таки да, записываете каждое включение и выключение. Дополнительно при выключении обновляете общее время работы в отдельной таблице.
Если полного лога не надо, то просто записываете время включения, при выключении обновляете общее время работы и обнуляете (null) время включения.
Полный лог и нужен.
Вот и не понимаю - как мне вытянуть разницу между записями и записать в базу ? Их же много в логе будет и все они хаотичны.
И кстати - обнулять время включения (Если я правильно его понял) нельзя. Мне нужно. чтоб видно было во сколько включился, во сколько выключился.
Спасибо, что откликнулись!
ReydAn913, Если нужен полный лог, то создаёте таблицу
`log` (`equipment_id`, `datetime`, `state`)
Записываете в неё каждое включение и выключение станка
INSERT INTO `log` (`equipment_id`, `datetime`, `state`)
VALUES (:eqId, NOW(), :state)
Создаёте вторую таблицу для накопительной статистики.
`statistics` (`equipment_id`, `last_on`, `total_time`)
При включении заносите в неё время включения
INSERT INTO `statistics` (`equipment_id`, `last_on`)
VALUES (:eqId, NOW(), 0)
ON DUPLICATE KEY UPDATE `last_on` = NOW()
При выключении обновляете
UPDATE `statistics`
SET `total_time` = `total_time` + TIMESTAMPDIFF(SECOND, `last_on`, NOW()),
`last_on` = NULL
WHERE `equipment_id` = :eqId