Този въпрос е за изваждане на работни дни. Ако приемем, че уикендът е събота-неделя, можем да запишем решението, както следва:
Ние знаем това:
- Всяка пълна седмица има 5 работни дни.
- Така,
- num_of_weeks =
floor(@num_working_days / 5)
- delta_days =
@num_working_days % 5
- num_of_weeks =
Така че, първото приближение може да бъде:
SET @num_working_days = 4; -- pick any integer
SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;
SELECT DATE_SUB(NOW(), INTERVAL @num_days DAY)
Това обаче няма да работи в следните и подобни случаи:
По принцип ще се провали, ако:
WEEKDAY(NOW()) - @num_working_days % 5 < 0
За да се отчете това, трябва да се извадят допълнителни 2 дни, когато това условие е изпълнено.
- overflow_days =
2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
И така, второто приближение би било:
SET @num_working_days = 4;
SET @overflow_days = 2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;
SELECT DATE_SUB(NOW(), INTERVAL @num_days DAY)
Най-накрая,
Това ще работи, докато now()
не е в week-end
ден. В този случай ще трябва да замените now()
в горната формула с предходната крайна дата на седмицата:
- weekend_correction =
DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY)
Което води до ужасно изглеждащи, но напълно работещи:
SET @num_working_days = 4;
SET @weekend_correction = DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY);
SET @overflow_days = 2 * (WEEKDAY(@weekend_correction) - @num_working_days % 5 < 0);
SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;
SELECT DATE_SUB(@weekend_correction, INTERVAL @num_days DAY);
Сега, в производството, препоръчвам ви да създадете функция на вашия MySQL сървър, за да капсулирате тази логика, и можете да извикате тази функция винаги, когато трябва да извадите работни дни.