Dette spørgsmål handler om at trække arbejdsdage fra. Forudsat at weekenden er lørdag-søndag, kan vi skrive løsningen som følger:
Vi ved, at:
- Hver hel uge har 5 arbejdsdage.
- Således
- antal_of_weeks =
floor(@num_working_days / 5)
- delta_days =
@num_working_days % 5
- antal_of_weeks =
Så en første tilnærmelse kunne være:
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)
Dette vil dog ikke virke i følgende og lignende tilfælde:
Generelt vil det mislykkes, hvis:
WEEKDAY(NOW()) - @num_working_days % 5 < 0
For at tage højde for det, skal der trækkes yderligere 2 dage fra, når denne betingelse er opfyldt.
- overløbsdage =
2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
Så den anden tilnærmelse ville være:
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)
Til sidst,
Dette vil virke så længe som now()
er ikke i en week-end
dag. I det tilfælde skal du erstatte now()
i ovenstående formel med den forrige weekends slutdato:
- weekend_correction =
DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY)
Hvilket fører til det forfærdelige udseende, men fuldt ud:
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 produktionen, anbefaler jeg, at du opretter en funktion på din MySQL-server til at indkapsle denne logik, og du kan kalde denne funktion, når du har brug for at trække arbejdsdage fra.