2016-07-22 3 views
0

Я хочу добавить 5 дней к указанной дате, но расчет должен пропустить выходные.MYSQL Добавить рабочие дни на сегодняшний день

Я уже знаю, как добавить 5 дней без выходного пропуска:

SELECT DATE_ADD(`date_field`, INTERVAL 5 DAY) As FinalDate 
FROM `table_name`; 

Теперь я хочу, возвращенное значение, чтобы пропустить выходные.

В настоящее время, если date_field = 2016-07-22 результаты будут 2016-07-27
Но я хочу, чтобы результаты были 2016-07-29

+0

Посетите http://stackoverflow.com/questions/5471524/add-business-days-to-date-in-sql-without-loops, это поможет вам самостоятельно разобраться с вашим решением. – cnayak

+0

Если вы планируете использовать это только для добавления 5 дней: разве вы всегда будете добавлять 7, потому что 5 рабочих дней - одна рабочая неделя? – Sam

+0

Да, но принятый ответ является гибким –

ответ

1

Попробуйте это:

SELECT DATE_ADD(
    date_field, 
    INTERVAL 5 + 
    IF(
     (WEEK(date_field) <> WEEK(DATE_ADD(date_field, INTERVAL 5 DAY))) 
     OR (WEEKDAY(DATE_ADD(date_field, INTERVAL 5 DAY)) IN (5, 6)), 
     2, 
     0) 
    DAY 
    ) AS FinalDate 
FROM `table_name`; 

Как это работает:

  • Во-первых, это будет добавьте 5 дней на свою дату.
  • Во-вторых, когда date_field и 5 дней спустя находятся в две недели, он должен быть добавлен дополнительно 2 дня.
  • В-третьих, если 5 дней спустя - Sat или Sun, его необходимо добавить дополнительно 2 дня.
0

я попробовать свои решения, но столкнулся с проблемой при использовании его с большим интервалом (например 20 дней). Он работает отлично с небольшими интервалами.

Пример: для '2017-10-04' + 20 дней ваш алгоритм возвращает '2017-10-26'. Это должно быть «2017-11-01», так как мы пропускаем 4 выходных.

Количество добавленных дней не рассчитывается в зависимости от разницы между 2 неделями #, поэтому максимальные дни, которые вы можете добавить, составляют 2, и в моем случае это должно быть 8 (4x2).

Я изменил свой код, чтобы закончить с этим (я также добавить переменные, гораздо удобнее изменить)

SELECT 
@ID:='2017-10-04' as initial_date, -- the initial date in the right format to manipulate (add x day) 
@DTA:=20 as days_to_add, -- number of days to add 
@DA:= DATE_ADD(@ID, INTERVAL @DTA DAY) as date_add, 
@LASTDAY := WEEKDAY(@DA) as last_day, -- the day (Monday, Tuesday...) corresponding to the initial date + number of days to add 
@WEEK1 := DATE_FORMAT(@ID, '%v') as initial_date_week, -- format the initial date to match week mode 3 (Monday 1-53) 
@WEEK2 := DATE_FORMAT(@DA, '%v') as added_date_week_nbr, -- the week # of the initial_date + number of days to add 
@WEEKDIFF := @WEEK2 - @WEEK1 as week_difference, -- the difference between week 2 and week 1 
DATE_ADD(@ID, 
     INTERVAL @DTA + 
      if (@WEEKDIFF > 0 or @LASTDAY in (5,6), 
       2, 
       0 
      ) + 
      if (@WEEKDIFF > 1, 
      @WEEKDIFF*2, 
      0 
      ) DAY 
    ) AS FinalDate 

так, как я получу неделю число может кажется странным, но это потому, что я бегу это во Франции и моей БД, кажется, настроены таким образом, что недели начинаются с воскресенья, «% v» представляет собой «режим 3» в течение нескольких недель, вы можете проверить документацию по MySQL здесь для получения более подробной информации: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html (ctrl + F > '% v')

Я еще не реализовал праздничный день, но я подумываю о добавлении X дней в расчет каждый раз в один из этих дней i в период, на который мы смотрим.

Согласно моим (нескольким) испытаниям, это должно работать. Дайте мне знать, если не

Смежные вопросы