sql >> Databasteknik >  >> RDS >> Mysql

Hur utesluter du helger från en date_sub?

Denna fråga handlar om att subtrahera arbetsdagar. Förutsatt att helgen är lördag-söndag kan vi skriva lösningen så här:

Vi vet att:

  • Varje hel vecka har 5 arbetsdagar.
  • Därför
    • antal_of_weeks =floor(@num_working_days / 5)
    • delta_days =@num_working_days % 5

Så en första uppskattning kan vara:

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)

Detta kommer dock inte att fungera i följande och liknande fall:

I allmänhet kommer det att misslyckas om:

WEEKDAY(NOW()) - @num_working_days % 5 < 0

För att ta hänsyn till det måste ytterligare 2 dagar dras av närhelst detta villkor är uppfyllt.

  • overflow_days =2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)

Så den andra approximationen skulle vara:

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)

Äntligen,

Detta kommer att fungera så länge som now() är inte i en week-end dag. I så fall måste du ersätta now() i formeln ovan med föregående helgdatum:

  • weekend_correction =DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY)

Vilket leder till att det ser hemskt ut men fungerar fullt ut:

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 produktion, rekommenderar jag att du skapar en funktion på din MySQL-server för att kapsla in denna logik, och du kan anropa den här funktionen när du behöver subtrahera arbetsdagar.



  1. Hur man ansluter GraphQL och PostgreSQL

  2. installera både mysql och mysqlnd på ubuntu 12.04

  3. Välj rader från MySQL-tabellen där PHP-tidsstämpeln är äldre än X

  4. Optimera skrivprestanda för AWS Aurora-instans