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

MySQL-Funktion, um die Anzahl der Arbeitstage zwischen zwei Daten zu ermitteln

Dieser Ausdruck -

5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)

berechnet die Anzahl der Werktage zwischen dem Startdatum @S und dem Enddatum @E.

Geht davon aus, dass das Enddatum (@E) nicht vor dem Startdatum (@S) liegt. Kompatibel mit DATEDIFF, da das gleiche Start- und Enddatum null Werktage ergibt. Feiertage werden ignoriert.

Die Ziffernfolge ist wie folgt aufgebaut. Erstellen Sie eine Tabelle mit Start- und Endtagen, die Zeilen müssen mit Montag (WEEKDAY0) beginnen und die Spalten müssen ebenfalls mit Montag beginnen. Füllen Sie die Diagonale von links oben nach rechts unten mit lauter 0 (d. h. es gibt 0 Werktage zwischen Montag und Montag, Dienstag und Dienstag usw.). Beginnen Sie für jeden Tag bei der Diagonale (muss immer 0 sein) und füllen Sie die Spalten bis auf Richtig, einen Tag nach dem anderen. Wenn Sie in einer Spalte für einen Wochenendtag (kein Werktag) landen, ändert sich die Anzahl der Werktage nicht, sie wird von links getragen. Andernfalls erhöht sich die Anzahl der Geschäftstage um einen. Wenn Sie das Ende der Reihe erreichen, schleifen Sie zurück zum Anfang derselben Reihe und fahren Sie fort, bis Sie wieder die Diagonale erreichen. Fahren Sie dann mit der nächsten Reihe fort.

Z.B. Angenommen, Samstag und Sonntag sind keine Werktage -

 | M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 1 2 3 4 5 0 0
S| 1 2 3 4 5 5 0

Verketten Sie dann die 49 Werte in der Tabelle zu der Zeichenfolge.

Bitte teilen Sie mir mit, wenn Sie Fehler finden.

-Verbesserte Tabelle bearbeiten:

 | M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 0 1 2 3 4 0 0
S| 0 1 2 3 4 4 0

verbesserte Zeichenfolge:'0123444401233334012222340111123400001234000123440'

verbesserter Ausdruck:

5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)