![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
Есть дата договора. Есть количество дней (рабочих) на исполнение, т.е. без субботы и воскресенья.
Как минимальными затратами вычислить дату окончания договора? -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
в предположении, что дата договора попадает на рабочий день недели
<остаток>=<рабочих дней>%5 <дней всего>=7*<рабочих дней>/5+<остаток>+max(0,<остаток>?<день недели даты договора>-3:0) Это сообщение отредактировал(а) baldina - 12.1.2014, 20:38 |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
если честно, то ничего не понял. И мне не нужны проценты вероятности. мне нужна точная дата (государственные праздники не в счёт).
Запросов должно быть много, так что код должен быть оптимизированный... ps может есть какая готовая функция? что-то я не нашёл -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Разумнее, imho, вести базу нерабочих дней. То есть каждая запись в базе выглядит {день:XXX}. В базу попадаю все выходные и праздничные дни. Из базы выкидываются все рабочие дни и дни переноса "праздников". Заполняются вручную + полуавтомат про выходные. Сама табличка не особенно большая, к тому же ее можно чистить от устаревших данных.
Для небольшого временнОго периода (неделя?), можно вычислять рабочие дни перебирая дни в цикле. Проверка - есть ли день в базе, если нету, значит рабочий. Для длинного диапазона - считаем, что от начальной даты должно пройти 7/5 дней от количества рабочих. Получаем диапазон. Выкидываем оттуда количество всех праздничных дней, из базы. получаем количество рабочих дней. Если рабочих дней нужно меньше или больше - отнимаем или прибавляем рабочие дни, как в первом случае. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
с базой не самый оптимальный вариант, но зато можно предусмотреть все праздники.. Нужно прикинуть...
я так понимаю, мне нужно посчитать количество недель и добавить по 2 дня для каждой недели. Плюсь сделать поправку на полную неделю, т.е. начало и конец -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
я тебе так и написал - как рассчитать число календарных дней. надеюсь по дате договора и числу дней ты в состоянии посчитать конечную дату. а ты про какие-то вероятности... но вообще ksnk прав, если это реальная задача, праздники тоже надо учитывать. и база - самый разумный вариант. её размер будет невелик, так что скорость достаточно высока. Добавлено @ 22:35
разжевал. в рот сам положишь? Это сообщение отредактировал(а) baldina - 12.1.2014, 22:59 |
||||
|
|||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
baldina, так если бы ты кодом писал сразу, а то алгоритмами.. вот и гадай что такое %5
а за разжевал +1 а вот по базе вопрос.. Мне необходимо "пробежаться" по базе договоров, допустим их порядка 500-1000 и высчитать просрочку.. Не сильно ли это подвисать будет? Хотя если кеш умный сделать... Это сообщение отредактировал(а) Gold Dragon - 12.1.2014, 23:20 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
1000 это очень, очень немного... Да и не нужна по 1000 договоров такая инфа, максимум по одному. Либо это некий отчет, а отчеты могут генериться не мгновенно, это нормально. Добавлено через 3 минуты и 4 секунды кстати. те же подсчеты можно прямо в запросе к базе проводить. и что-то мне подсказывает, что они будут быстрее php... и медленнее join таблицы праздников. |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
В общем нужно скорость проверять в реальных условиях... -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| maxipub |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: нет Всего: 1 |
Получаем timestamp начальной даты, и в цикле прибавляем к нему 86400, пока не дойдем до конечной даты, инкрементируя счетчик рабочих дней, где date('w', $timestamp) не 0, и не 6 (вс=0, сб=6). Может быть не минимальные затраты, но все же 5-6 строй кода. Да и корректней будет считать.
ЗЫ: лет 10 сижу на форуме, всегда только спрашивал, что это сегодня решил ответить? Добавлено через 2 минуты и 23 секунды
0.05 сек, не более |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
В таком духе лучше не отвечать -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
baldina, что-то твой код не хочет рабоать.. уже устал его ломать
например, задаю даты с шагом один день, получаю в два. Или задаю нчало договора в выходной, вообще как-то странно считает -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
дата договора за день считается: договор может закончиться в тот же день, но не раньше. если надо можешь вычесть 1 http://ideone.com/Ao5zCk |
|||
|
||||
| Gold Dragon |
|
||||||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
а если так
то дата окончания
А это выходные PS выходные - рассматриваем только субботу и воскресенье Добавлено через 3 минуты и 22 секунды а если так
то имеем
Это сообщение отредактировал(а) Gold Dragon - 24.1.2014, 13:43 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||||||
|
|||||||||
| capitan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 27.2.2005 Где: Москва Репутация: 9 Всего: 13 |
Была подобная задача. Показывать дату доставки учитывая выходные, праздники + смещение.
|
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |