|
|
|
Функция изменения даты на определенное количество РАБОЧИХ дней
|
|||
|---|---|---|---|
|
#18+
Добрый день. Очень нужна помощь! Есть функция, изменяющая дату на указанное количество рабочих дней, т.е. без учета выходных и праздников. Выходные дни высчитываются с помощью weekday, а все праздничные дни перечислены в отдельной таблицы базы и берутся оттуда. Функция рабочая, одна все равно где-то считает не правильно. Все перепробовала, может что-то не так делаю. Может кто подскажет, в чем проблема(( CREATE FUNCTION `add_workday2`(mydate DATE, numday INT) RETURNS date BEGIN DECLARE num_week INT DEFAULT 0; DECLARE num_day INT DEFAULT 0; DECLARE holidays_count INT DEFAULT 0; DECLARE adj INT DEFAULT 0; DECLARE finaldate DATE; DECLARE total INT DEFAULT 0; DECLARE total_end INT DEFAULT 0; SET num_week = numday DIV 5; SET num_day = MOD(numday, 5); IF (WEEKDAY(mydate) + num_day >= 5) then SET adj = 2; END IF; SET total = num_week * 7 + adj + num_day; if weekday(mydate) = 5 then SET total = (num_week * 7 + adj + num_day) - 1; end if; if weekday(mydate) = 6 then SET total = (num_week * 7 + adj + num_day) - 2; end if; SET total = num_week * 7 + adj + num_day; set finaldate = DATE_ADD(mydate, INTERVAL total DAY); set holidays_count = (select count(*) from holidays where holiday between curdate() and finaldate); set total_end = (total + holidays_count); if weekday(finaldate) = 5 then SET total_end = total_end + 3; SET finaldate = DATE_ADD(finaldate, INTERVAL total_end DAY); end if; if weekday(finaldate) = 6 then SET total_end = total_end + 2; SET finaldate = DATE_ADD(finaldate, INTERVAL total_end DAY); end if; RETURN finaldate; END ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 14:33 |
|
||
|
Функция изменения даты на определенное количество РАБОЧИХ дней
|
|||
|---|---|---|---|
|
#18+
belka-rznВыходные дни высчитываются с помощью weekday, а все праздничные дни перечислены в отдельной таблицы базы и берутся оттуда.Уже неправильно. Не учитываете перенос рабочего дня на выходной (вот как в этом году рабочий день понедельника 22 февраля был перенесён на субботу 20 февраля, например). У Вас должна быть таблица "Производственный календарь", а не просто таблица праздничных дней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 14:37 |
|
||
|
Функция изменения даты на определенное количество РАБОЧИХ дней
|
|||
|---|---|---|---|
|
#18+
Это я в курсе, именно это и сделано на текущий год. Праздничные дни и все нерабочие, что не выпадают на выходные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 14:38 |
|
||
|
Функция изменения даты на определенное количество РАБОЧИХ дней
|
|||
|---|---|---|---|
|
#18+
Ну а если так - то декартим заданную дату на календарь (с вменяемым пред-отбором) и считаем минимальную дату из второй копии календаря, для которой количество рабочих дней в полученном диапазоне равно заданному. Для упрощения задачи разумно в качестве пометки рабочего дня ставить 1, иначе 0 - тогда для подсчёта количества можно использовать вульгарную SUM(). Ещё проще получится решение, если использовать накопительную переменную с соответствующей сортировкой набора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 15:20 |
|
||
|
Функция изменения даты на определенное количество РАБОЧИХ дней
|
|||
|---|---|---|---|
|
#18+
Akina, мда.... к сожалению, мои познания не настолько обширны(( Можно как-то поподробнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 15:25 |
|
||
|
Функция изменения даты на определенное количество РАБОЧИХ дней
|
|||
|---|---|---|---|
|
#18+
Есть FAQ: Нумерация строк и другие вопросы про использование переменных . Его надо изучить. Поставленная задача - это "пронумеровать рабочие дни от исходного и далее, и найти день с заданным номером". Всего-то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 16:07 |
|
||
|
Функция изменения даты на определенное количество РАБОЧИХ дней
|
|||
|---|---|---|---|
|
#18+
belka-rzn, как-то так... (если есть производственный календарь с полями DMY - дата, IS_WORK - бит =1 - рабочий день) в MySQL не проверял. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2016, 19:35 |
|
||
|
Функция изменения даты на определенное количество РАБОЧИХ дней
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, Работает! Спасибо большое! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 13:23 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=104&tid=1831874]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
22ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
24ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 319ms |

| 0 / 0 |
