Denna fråga handlar om att subtrahera arbetsdagar. Förutsatt att helgen är lördag-söndag kan vi skriva lösningen så här:
Vi vet att:
- Varje hel vecka har 5 arbetsdagar.
- Därför
- antal_of_weeks =
floor(@num_working_days / 5)
- delta_days =
@num_working_days % 5
- antal_of_weeks =
Så en första uppskattning kan vara:
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)
Detta kommer dock inte att fungera i följande och liknande fall:
I allmänhet kommer det att misslyckas om:
WEEKDAY(NOW()) - @num_working_days % 5 < 0
För att ta hänsyn till det måste ytterligare 2 dagar dras av närhelst detta villkor är uppfyllt.
- overflow_days =
2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
Så den andra approximationen skulle vara:
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)
Äntligen,
Detta kommer att fungera så länge som now()
är inte i en week-end
dag. I så fall måste du ersätta now()
i formeln ovan med föregående helgdatum:
- weekend_correction =
DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY)
Vilket leder till att det ser hemskt ut men fungerar fullt ut:
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);
Nu, i produktion, rekommenderar jag att du skapar en funktion på din MySQL-server för att kapsla in denna logik, och du kan anropa den här funktionen när du behöver subtrahera arbetsdagar.