sql >> Database >  >> RDS >> Mysql

MySQL-functie om het aantal werkdagen tussen twee datums te vinden

Deze uitdrukking -

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

berekent het aantal werkdagen tussen de startdatum @S en de einddatum @E.

Gaat ervan uit dat de einddatum (@E) niet vóór de startdatum (@S) ligt. Compatibel met DATEDIFF omdat dezelfde startdatum en einddatum nul werkdagen opleveren. Vakanties worden genegeerd.

De reeks cijfers is als volgt opgebouwd. Maak een tabel met start- en einddagen, de rijen moeten beginnen met maandag (WEEKDAY0) en de kolommen moeten ook beginnen met maandag. Vul de diagonaal van linksboven naar rechtsonder met allemaal 0 (d.w.z. er zijn 0 werkdagen tussen maandag en maandag, dinsdag en dinsdag, enz.). Begin voor elke dag bij de diagonaal (moet altijd 0 zijn) en vul de kolommen in tot juist, een dag tegelijk. Als u op een kolom van een weekenddag (niet-werkdag) terechtkomt, verandert het aantal werkdagen niet, het wordt vanaf de linkerkant overgenomen. Anders wordt het aantal werkdagen met één verhoogd. Wanneer je het einde van de rij bereikt, ga je terug naar het begin van dezelfde rij en ga je verder totdat je weer de diagonaal bereikt. Ga dan verder naar de volgende rij.

bijv. Ervan uitgaande dat zaterdag en zondag geen werkdagen zijn -

 | 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

Voeg vervolgens de 49 waarden in de tabel samen in de tekenreeks.

Laat het me weten als je bugs vindt.

-Bewerk verbeterde tabel:

 | 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

verbeterde tekenreeks:'012344440123333401222234011112340001234000123440'

verbeterde uitdrukking:

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


  1. Hoe te groeperen op jaar in SQL

  2. MS Access-oproep SQL Server opgeslagen procedure

  3. hoe een tekenreeksdatum naar datumnotatie te converteren in oracle10g

  4. Load Balancers vergelijken voor PostgreSQL