Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie schließen Sie Wochenenden aus einem date_sub aus?

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

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.