Bei dieser Frage geht es um das Subtrahieren von Arbeitstagen. Unter der Annahme, dass das Wochenende Samstag-Sonntag ist, können wir die Lösung wie folgt schreiben:
Das wissen wir:
- Jede volle Woche hat 5 Werktage.
- Also,
- Anzahl_der_Wochen =
floor(@num_working_days / 5)
- delta_days =
@num_working_days % 5
- Anzahl_der_Wochen =
Eine erste Annäherung könnte also sein:
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)
Dies funktioniert jedoch nicht in den folgenden und ähnlichen Fällen:
Im Allgemeinen schlägt es fehl, wenn:
WEEKDAY(NOW()) - @num_working_days % 5 < 0
Um dies zu berücksichtigen, müssen zusätzliche 2 Tage abgezogen werden, wann immer diese Bedingung erfüllt ist.
- overflow_days =
2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
Die zweite Annäherung wäre also:
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)
Endlich,
Dies funktioniert solange now()
liegt nicht an einem week-end
Tag. In diesem Fall müssten Sie now()
ersetzen in der obigen Formel mit dem letzten Wochenenddatum:
- weekend_correction =
DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY)
Was zu dem schrecklich aussehenden, aber voll funktionsfähigen Ergebnis führt:
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);
In der Produktion empfehle ich jetzt, dass Sie eine Funktion auf Ihrem MySQL-Server erstellen, um diese Logik zu kapseln, und Sie können diese Funktion immer dann aufrufen, wenn Sie Arbeitstage subtrahieren müssen.