sql >> Database teknologi >  >> RDS >> Mysql

Hvordan udelukker du weekender fra en date_sub?

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

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.



  1. Filtrer MYSQL-forespørgsel med formularindstillinger

  2. Udfør produktanalyse ved hjælp af SQL Server Full-Text Search. Del 1

  3. Hvordan kan jeg bruge ADO.NET DbProviderFactory med MySQL?

  4. PHP PDO-indsæt ved hjælp af loop