PHP для расчета количества рабочих часов между двумя датами - PullRequest
7 голосов
/ 26 января 2010

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

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

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

Ответы [ 3 ]

1 голос
/ 26 января 2010

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

0 голосов
/ 26 января 2010

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

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

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

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

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

0 голосов
/ 26 января 2010

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...