powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Функция изменения даты на определенное количество РАБОЧИХ дней
9 сообщений из 9, страница 1 из 1
Функция изменения даты на определенное количество РАБОЧИХ дней
    #39220224
belka-rzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Очень нужна помощь!
Есть функция, изменяющая дату на указанное количество рабочих дней, т.е. без учета выходных и праздников. Выходные дни высчитываются с помощью 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
...
Рейтинг: 0 / 0
Функция изменения даты на определенное количество РАБОЧИХ дней
    #39220226
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belka-rznВыходные дни высчитываются с помощью weekday, а все праздничные дни перечислены в отдельной таблицы базы и берутся оттуда.Уже неправильно. Не учитываете перенос рабочего дня на выходной (вот как в этом году рабочий день понедельника 22 февраля был перенесён на субботу 20 февраля, например).

У Вас должна быть таблица "Производственный календарь", а не просто таблица праздничных дней.
...
Рейтинг: 0 / 0
Функция изменения даты на определенное количество РАБОЧИХ дней
    #39220231
belka-rzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это я в курсе, именно это и сделано на текущий год. Праздничные дни и все нерабочие, что не выпадают на выходные
...
Рейтинг: 0 / 0
Функция изменения даты на определенное количество РАБОЧИХ дней
    #39220299
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а если так - то декартим заданную дату на календарь (с вменяемым пред-отбором) и считаем минимальную дату из второй копии календаря, для которой количество рабочих дней в полученном диапазоне равно заданному. Для упрощения задачи разумно в качестве пометки рабочего дня ставить 1, иначе 0 - тогда для подсчёта количества можно использовать вульгарную SUM().
Ещё проще получится решение, если использовать накопительную переменную с соответствующей сортировкой набора.
...
Рейтинг: 0 / 0
Функция изменения даты на определенное количество РАБОЧИХ дней
    #39220309
belka-rzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

мда.... к сожалению, мои познания не настолько обширны((
Можно как-то поподробнее?
...
Рейтинг: 0 / 0
Функция изменения даты на определенное количество РАБОЧИХ дней
    #39220375
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть FAQ: Нумерация строк и другие вопросы про использование переменных . Его надо изучить.

Поставленная задача - это "пронумеровать рабочие дни от исходного и далее, и найти день с заданным номером". Всего-то...
...
Рейтинг: 0 / 0
Функция изменения даты на определенное количество РАБОЧИХ дней
    #39221738
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belka-rzn,
как-то так... (если есть производственный календарь с полями DMY - дата, IS_WORK - бит =1 - рабочий день)
в MySQL не проверял.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select max(n.dmy)
into finalDate 
  from (
    select c.dmy
    from Calendar c
    where c.is_work=1
      and c.dmy>myDate
    limit numDay
  )n
...
Рейтинг: 0 / 0
Функция изменения даты на определенное количество РАБОЧИХ дней
    #39222382
belka-rzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

Работает! Спасибо большое!
...
Рейтинг: 0 / 0
Функция изменения даты на определенное количество РАБОЧИХ дней
    #39223843
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belka-rzn,

я только забыл обязательный ORDER BY указать.
без него порядок выборки дат не гарантирован - иногда может неверный результат выдавать))
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Функция изменения даты на определенное количество РАБОЧИХ дней
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]