Перейти к содержимому


Подсчитать время выполнения задания


Сообщений в теме: 24

#1 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 19 Июль 2014 - 19:25

Имеется 2 таблицы "Задания" и "Работа по заданию". При изменении поля "статус" в "задания" в таблицу формируется запись с описанием статуса задания, тек. пользователь и дата. Поле статус имеет поля - в работе, пауза, выполнено.
Задача стоит в том, чтобы посчитать сколько времени потратил пользователь на задние с учетом паузы.
То есть таблица "Работа по заданию" является что-то подобное логу где отображаются все действия пользователя.
Имеется функция которая считает время которое было затрачено на выполнение задания без учета паузы, но я никак не могу продумать условие чтобы из общего времени вычиталось время которое было на паузе, к тому же пауз может быть несколько. Подскажите пожалуйста каким образом можно это реализовать.

Чтобы было понятнее привожу формат таблицы "Работа по заданию":
пользователь | в работе | дата
пользователь | пауза | дата
пользователь | в работе | дата
пользователь | пауза | дата
пользователь | в работе | дата
пользователь | выполнено|  дата


#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 20 Июль 2014 - 13:45

Проходитесь в цикле по всем записям. Смотрите статус очередной записи, если "в работе", сохраняете в переменную дату. Если "пауза" - отнимаете из даты дату из переменной, получаете потраченное до паузы время, заносите в другую переменную, где будет суммироваться общее время, и так далее.

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

#3 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 21 Июль 2014 - 09:26

Подскажите пожалуйста в чем может быть проблема.
Имеется функция подсчета разницы времени между датами. Если выводить в echo с конкретными датами, то работает правильно но если я вставляю переменные, которые получаю из полей то она отказывается корректно работать.
Вот код:

function diffdate($dt1, $dt2)
  { 
	 $dt1 = preg_replace('/(\d*?)(?:\.|[-])(\d*?)(?:\.|[-])(\d*?)\s*?(\d*?:\d*?)/is', '$1-$2-$3 $4', $dt1);
	 $dt2 = preg_replace('/(\d*?)(?:\.|[-])(\d*?)(?:\.|[-])(\d*?)\s*?(\d*?:\d*?)/is', '$1-$2-$3 $4', $dt2);
	 return ((strtotime($dt2) - strtotime($dt1))/3600);
  }
$row = data_select_array(84, "`status`=0 AND `f9352`='выполнено'");
$date_finish = $row['f1072'];
$date_start = $line['Добавлено'];
$Times = diffdate($date_start, $date_finish);
echo 'razn='. diffdate('2014-07-18 9:20', '2014-07-21 10:25');


#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Июль 2014 - 09:46

Цитата

Если выводить в echo с конкретными датами

И что за "конкретные даты" вы вводите через echo? В БД все даты хранятся в формате "Y-m-d" (например "2014-07-21" для сегодня). Ваша функция может не работать с ними. В частности preg_replace там лишний, достаточно использовать последнюю строку. Вообще, по операциям с датами есть специальная тема, закрепленная причем, далеко не всегда правильно искать функции где-то на стороне.

#5 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 21 Июль 2014 - 09:50

вот что я ввожу - формат даты вроде правильный. проверял выводя переменные.
echo 'razn='. diffdate('2014-07-18 9:20', '2014-07-21 10:25');


#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Июль 2014 - 10:05

А часы тут причем? У вас же речь о датах только была? Если с часами, то формат даты/времени в БД "Y-m-s H:i:s", т.е. "2014-07-21 11:00:00". В любом случае, это не меняет моей фразы выше: вся функция тут лишняя, достаточно последней строки из нее: (strtotime($dt2) - strtotime($dt1))/3600. Можно вообще без функции, сразу в коде прописать:

$Times = (strtotime($date_finish) - strtotime($date_start))/3600


#7 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 21 Июль 2014 - 10:09

Мне нужно получить время в часах потраченное на задание. Даже убрав preg_replace в работе ничего не изменилось. показывает не правильно

#8 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Июль 2014 - 10:11

Я менял свое сообщение пару раз, перечитайте. Код должен работать правильно, если конечно вы сами вставляете туда то что нужно.

#9 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 21 Июль 2014 - 10:16

Цитата

формат даты/времени в БД "Y-m-s H:i:s"
тут все правильно? у меня формат $mas['Дата']= date("Y-m-d H:i:s");

#10 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Июль 2014 - 10:25

Что именно правильно, не понял? Причем тут присваивание текущей даты? Речь выше шла о высчитывании разницы дат, а не о присваивании.

#11 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 21 Июль 2014 - 10:27

у вас тут опечатка? Y-m-s H:i:s ??? или такой правильный вариант?

#12 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Июль 2014 - 10:36

Да, опечатка конечно. Но это уже не имеет значения, речь шла только о примерах. Если вы используете даты из БД - там уже нужный формат, просто используйте мой вариант для расчета разницы в часах. Хотя, как я уже сказал, возможно дело и не в функции (она просто излишня), а вы просто не те даты берете, например запрос возвращает не то что хотели. Но это предположение только.

#13 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 21 Июль 2014 - 10:38

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

#14 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 21 Июль 2014 - 10:51

Имеет ли значение, что это вычисление выполняется в доп. действии? По сути вторая дата формируется путем изменения статуса в таблице после чего идет вычисление которое стоит на изменение поля и добавляет запись в таблицу с логом.

Думаю проблема именно в этом.

$line['Статус выполнения']="выполнено"; //изменяем статус в таблице "Задания"
// после этого пойдет второе вычисление на добавление записи в таблицу "Работа по заданию"
$row = data_select_array(84, "`status`=0 AND `f9352`='выполнено'"); 
$date_finish = $row['f1072'];// тут получаю дату из таблицы "Работа по заданию"
$date_start = $line['Добавлено'];
$Times = (strtotime($date_finish) - strtotime($date_start))/3600;
$line['время выполнения']=$Times;


#15 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Июль 2014 - 11:22

Не должно влиять, код доп.действия - это такое же вычисление, только на событие нажатия кнопки. Если код выше на самом деле из двух частей (не совсем понял правда, зачем вы их тогда в одно окно кода поместили), то ошибки нет. Хотя, вы же сами говорите, что выводили дату через echo и она верная, к чему тогда эти все вопросы?

#16 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 21 Июль 2014 - 11:40

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

Вот код вычисления который стоит на изменение поля:

$mas['Назначил']=$line['Добавил'];
$mas['Исполнитель']=$line['Исполнитель'];
$mas['Задание']=$line['Номер'];
$mas['Описание']=$line['Описание задания'];
$mas['Статус выполнения']=$line['Статус выполнения'];
$mas['Статус контроля']=$line['Статус контроля'];
$mas['Дата']= date("Y-m-d H:i:s");
insert_query($mas, "Работа по заданию");

То ли баг какой-то.

#17 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Июль 2014 - 12:11

Цитата

просто я больше не знаю в чем может быть проблема - код выше находится в одном окне доп. действия

Тогда не понял, что за фраза "после этого пойдет второе вычисление на добавление записи в таблицу "Работа по заданию"". Или вы думаете, что у вас в середине кода доп.действия вдруг выполнится вычисление на изменение поля "Статус выполнения", а потом продолжится дальше выполнение по коду доп.действия? Если вы всерьез так думаете - то это очень большое заблуждение. У нас даже в документации написано, что любые изменения в $line влияют на что либо реально только после выполнения кода (в том числе и по запуску событий по изменению), т.к. это всего лишь переменная, а не функция и не метод/свойство объекта.

Цитата

даты выводит верные, но в итоге расчета получается отрицательное число

Ну тогда причем тут код выше? Возможно порядок дат не тот, вот и число с минусом. Хотя странно это все, если как вы говорите с датами все норм, то и выражение должно верно считать. Там же все элементарно. Но у меня подозрение что сам код не тот, судя по моим выводам выше.

#18 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 21 Июль 2014 - 12:13

сейчас еще раз проверю даты - посмотрю что выводится

#19 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 21 Июль 2014 - 12:33

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

#20 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 21 Июль 2014 - 15:09

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

$line['Статус выполнения']="выполнено";
$date_finish = date("Y-m-d H:i:s");
$date_start = $line['Добавлено'];
$Times = (strtotime($date_finish) - strtotime($date_start))/3600; // получаю время без паузы
$res = data_select(84, "`status`=0 AND `f1078` = ",$line['Номер'],"");
while ($row2 = sql_fetch_assoc($res))
{
if($row2['f9352']=="пауза")
{
  $date1 = $row2['f1072'];
  $dif = -strtotime($date1)/3600;
}

if($row2['f9352']=="в рабoте")
{
  $date2 = $row2['f1072'];
  $dif = strtotime($date2)/3600;
}

if($date1 == 0 && $date2 == 0)
{
  $dif = 0;
}
$Times = $Times - $dif; // получаю время с паузой
}

$line['время выполнения'] = round ($Times);;

Сообщение отредактировал aleks.goodcolor: 21 Июль 2014 - 15:13






Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных