PHP для расчета количества рабочих часов между двумя датами

Мы предоставляем услугу, основанную на двухдневном соглашении об уровне обслуживания, поэтому, если запрос отправляется в 13:00 понедельника, он должен быть выполнен до 13:00 среды.

Итак, в базе данных у меня есть две метки времени MySQL ГГГГ/ММ/ДД ЧЧ:ММ:СС, и мне нужен какой-то способ определить время между двумя датами в рабочее время, исходя из рабочего времени с 9:00 до 17:00.

Может ли кто-нибудь дать мне какие-либо идеи?


person Sjwdavies    schedule 26.01.2010    source источник


Ответы (3)


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

person Victor Nicollet    schedule 26.01.2010

В общих чертах, учитывая метки времени A и B, где A — время начала:

  • определить количество дней между A и B (есть простые способы сделать это), назовите это D
  • если ЧЧ:ММ:СС для метки времени B больше или равно значению для A, то добавьте разницу во времени H, получив D (дни) + H (время)
  • если ЧЧ:ММ:СС для метки времени B меньше, чем для A, вычтите 1 из D и добавьте 8 часов минус разница во времени H, получив D - 1 (дни) + 8 (часы) - H

В вашем примере, если A — 13:00 понедельника, а B — 13:00 среды, то D — 2. Поскольку время одинаковое, H — 0, поэтому общая разница составляет 2 рабочих дня.

Если бы B было 15:00 среды, то общая разница составила бы 2 дня плюс 2 часа.

Если бы B было 9:00 среды, то общая разница составила бы 1 день плюс 4 часа.

Приведенный выше метод не работает с выходными или праздничными днями, поэтому вам придется внести соответствующие изменения.

person Greg Hewgill    schedule 26.01.2010

Создать это только с помощью SQL сложно. В MySQL разница между меткой времени может быть рассчитана таким образом...

SELECT TIMESTAMPDIFF(HOUR,T.ts2,T.ts1) 
FROM test AS T;

...но это не учитывает рабочие часы.

Имейте в виду, что SQL не знает ваши рабочие часы, и они могут также зависеть от других факторов (выходных, государственных праздников и т. д.). Чтобы это сделать, вам нужно сначала настроить таблицу календаря, а затем начать вычисления.

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

person Bjoern    schedule 26.01.2010