Mysql
 sql >> база данни >  >> RDS >> Mysql

Как изключвате почивните дни от date_sub?

Този въпрос е за изваждане на работни дни. Ако приемем, че уикендът е събота-неделя, можем да запишем решението, както следва:

Ние знаем това:

  • Всяка пълна седмица има 5 работни дни.
  • Така,
    • num_of_weeks =floor(@num_working_days / 5)
    • delta_days =@num_working_days % 5

Така че, първото приближение може да бъде:

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)

Това обаче няма да работи в следните и подобни случаи:

По принцип ще се провали, ако:

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

За да се отчете това, трябва да се извадят допълнителни 2 дни, когато това условие е изпълнено.

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

И така, второто приближение би било:

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)

Най-накрая,

Това ще работи, докато now() не е в week-end ден. В този случай ще трябва да замените now() в горната формула с предходната крайна дата на седмицата:

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

Което води до ужасно изглеждащи, но напълно работещи:

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); 

Сега, в производството, препоръчвам ви да създадете функция на вашия MySQL сървър, за да капсулирате тази логика, и можете да извикате тази функция винаги, когато трябва да извадите работни дни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Предизвикателства при мащабирането на MySQL базата данни на Moodle

  2. използване на GROUP BY в mysql 8

  3. Грешка при несинхронизирани команди на PHP

  4. MySQL премахва нечислови знаци за сравнение

  5. Boolean срещу tinyint(1) за булеви стойности в MySQL