vanesxl
@vanesxl

Как посчитать количество дней с учетом всех выходных в MySQL?

Добрый день,
мне необходимо реализовать следующее:
Есть таблица 1 (t1)
в ней есть 2 столбца (c1 и c2) оба они типа date (плюс еще 1 столбец id)

Есть таблица 2 (t2)
Она хранит в себе все выходные дни за 2018-2019 г. то есть там 1 столбец типа date (плюс еще 1 столбец id)

Мне нужно узнать сколько рабочих дней между двумя датами с первой таблице, т.е. t1.c1 - t1.c2
Сколько календарных дней я могу узнать легко, а вот рабочих пока не могу понять как сделать.
Мне все нужно реализовать именно на MySQL.
  • Вопрос задан
  • 480 просмотров
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
select count(*) as work_day_count --считаем, что осталось после отсечения выходных и праздников
  from (SELECT distinct t1.*, t1.c1 + INTERVAL iterator.day DAY as dt_day
             FROM (select STR_TO_DATE("01.10.2018", "%d.%m.%Y") c1,  STR_TO_DATE("22.10.2018", "%d.%m.%Y") c2 union all
                   select STR_TO_DATE("22.10.2018", "%d.%m.%Y") c1,  STR_TO_DATE("10.11.2018", "%d.%m.%Y") c2 ) t1 --таблица с проверяемыми интервалами
 
 join (select @start_day := @start_day + 1 as day
         from news,  -- любая произвольная таблица с числом строк, больше чем ширина максимально возможного интервала дней, который можно рассмотреть этим запросом
              (select @start_day := -1) init_day --инициализация переменной start_day 
      ) iterator --итератор дней, ведет отсчет с 0 и до куда надо (до максимального интервала, который может быть)
   on (t1.c1 + INTERVAL iterator.day DAY) <= t1.c2 --верхнее ограничение итератора
                and (t1.c1 + INTERVAL iterator.day DAY) not in -- отсекаем выходные и праздники
(select STR_TO_DATE("06.10.2018", "%d.%m.%Y") c1 union all
 select STR_TO_DATE("07.10.2018", "%d.%m.%Y") c1 union all
 select STR_TO_DATE("13.10.2018", "%d.%m.%Y") c1 union all
 select STR_TO_DATE("14.10.2018", "%d.%m.%Y") c1 union all
 select STR_TO_DATE("20.10.2018", "%d.%m.%Y") c1 union all
 select STR_TO_DATE("21.10.2018", "%d.%m.%Y") c1 union all
 select STR_TO_DATE("27.10.2018", "%d.%m.%Y") c1 union all
 select STR_TO_DATE("28.10.2018", "%d.%m.%Y") c1 union all
 select STR_TO_DATE("03.10.2018", "%d.%m.%Y") c1 union all
 select STR_TO_DATE("04.11.2018", "%d.%m.%Y") c1 union all
 select STR_TO_DATE("10.11.2018", "%d.%m.%Y") c1 union all
 select STR_TO_DATE("11.11.2018", "%d.%m.%Y") c1) -- тут делаем выборку выходных дней и праздников
order by dt_day ) a
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы