Время завершения в рабочее время - PullRequest
0 голосов
/ 22 августа 2011

Хорошо, не так много проблем с программированием, но я могу только думать о действительно сложных методах решения этой проблемы.

В офисе есть скрипт, который мы запускаем.Нам нужно определить, сколько времени займет выполнение этого скрипта только в рабочее время (рабочие часы с 9 до 17).Например, предположим, что скрипт запускается в понедельник в 14:00 и заканчивается во вторник в 16:00.Этот сценарий занял 26 часов, но только 10 часов.Этот сценарий может быть завершен в течение одного рабочего дня, но также может занимать несколько дней.Сценарий может начинаться и заканчиваться только в течение рабочего дня.Отметка времени выполняется в формате Unix.

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

Язык сценариев на стороне сервераэто PHP.Так что это будет второй доступный вариант.Моя попытка ниже:

$workingDay = 24;
$workingDayHours = 8;
$workingTime = 0;

while($timeTaken >= $workingDay) {
  $workingTime += $workingDayHours;
  $timeTaken -= $workingDay;
}
$workingTime += $timeTaken;

Я не могу сейчас правильно думать, слишком много работы, поэтому, хотя этот метод глуп, в этом сценарии он работает, так как $ timeTaken всегда будет<= 8 ||> = 24.

В любом случае, было бы здорово увидеть лучший и более умный метод (возможно, такой, который будет работать с любым количеством часов).SQL тоже было бы здорово увидеть.

1 Ответ

0 голосов
/ 22 августа 2011

как-то так (будет работать, только если задание начнется и завершится в период с 9: 00-17: 00) ... (не проверено извините)

Истекшая продолжительность в часах:

 HOUR(TIMEDIFF(enddatetime-startdatetime))

Чтобы рассчитать количество рабочих часов:

Нам необходимо удалить n 16-часовых периодов, когда задание не выполнялось (любое задание, выполняемое более 16 часов, должно выполняться в течение n дней)

duration - (FLOOR(duration/16)*16)

чтобы получить:

SELECT HOUR(TIMEDIFF(enddatetime-startdatetime)) - 
          (FLOOR(HOUR(TIMEDIFF(enddatetime-startdatetime))/16)*16) AS duration

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

(week(enddatetime,1) - week(startdatetime,1)) * 48
...