вычесть рабочие дни (от 0 до 99) с указанной даты (повторяющаяся дата исполнения) - PullRequest
0 голосов
/ 25 сентября 2019
Stored Procedure runs every morning . 
it runs for everyday as' Current_date()+90 '
today's date - > 09/25/2019 
Currentdate+90 - > 12/24/2019 
pattern -> weekly (M/T/W/R/F) 
Recurs > every friday 
old Reminder -> 4 which is  12/30/2019. (old- 1 to 7 days)
New Reminder can be (0 to 99 days)

Eg : 
1.start date (due-REminder) = 12/24/2019, due date =12/30/2019
2.start date= 12/31/2019,due_date=01/06/2019

Код, написанный ниже, уже работает.Но ввод напоминания был изменен с (1 до 7) на (от 0 до 99).Я хотел бы знать, если есть какой-либо другой способ, а не ручной расчет

***************** Существующий код *****************************

SELECT ID,
    TASK_ID,
    PATTERN,
    FINAL_REMINDER,
   CASE WHEN WEEKDAY( ACT_START_DT)=5 THEN DATE_SUB(ACT_START_DT,INTERVAL 1 DAY) 
   WHEN WEEKDAY( ACT_START_DT)=6 THEN DATE_SUB(ACT_START_DT,INTERVAL 2 DAY)
   ELSE ACT_START_DT END AS FNL_START_DT,
    FNL_DUE_DT
FROM(
SELECT W2.*, 
CASE
WHEN WEEKDAY(DATE_ADD(UTC_DATE(),INTERVAL 90 DAY))=3 AND WEEKDAY(ACT_DUE_DT)=5 THEN DATE_ADD(ACT_DUE_DT,INTERVAL 2 DAY) # THIS IS FOR REMINDER(6 OR 7)
WHEN WEEKDAY(DATE_ADD(UTC_DATE(),INTERVAL 90 DAY))=3 AND WEEKDAY(ACT_DUE_DT)=6 THEN DATE_ADD(ACT_DUE_DT,INTERVAL 2 DAY)
WHEN WEEKDAY(DATE_ADD(UTC_DATE(),INTERVAL 90 DAY))=4 AND WEEKDAY(ACT_DUE_DT)=5 THEN DATE_ADD(ACT_DUE_DT,INTERVAL 2 DAY)
WHEN WEEKDAY(DATE_ADD(UTC_DATE(),INTERVAL 90 DAY))=4 AND WEEKDAY(ACT_DUE_DT)=6 THEN DATE_ADD(ACT_DUE_DT,INTERVAL 2 DAY)
ELSE ACT_DUE_DT
END AS FNL_DUE_DT, 

CASE
WHEN WEEKDAY(DATE_ADD(UTC_DATE(),INTERVAL 90 DAY))=3 AND WEEKDAY(ACT_DUE_DT)=5 THEN NEW_REMINDER+2# THIS IS FOR REMINDER(6 OR 7)
WHEN WEEKDAY(DATE_ADD(UTC_DATE(),INTERVAL 90 DAY))=3 AND WEEKDAY(ACT_DUE_DT)=6 THEN NEW_REMINDER+2
WHEN WEEKDAY(DATE_ADD(UTC_DATE(),INTERVAL 90 DAY))=4 AND WEEKDAY(ACT_DUE_DT)=5 THEN NEW_REMINDER+2
WHEN WEEKDAY(DATE_ADD(UTC_DATE(),INTERVAL 90 DAY))=4 AND WEEKDAY(ACT_DUE_DT)=5 THEN NEW_REMINDER+2
ELSE NEW_REMINDER
END AS FINAL_REMINDER
FROM
(
SELECT * ,DATE_ADD(UTC_DATE(),INTERVAL 90 DAY) AS ACT_START_DT,
         date_add(DATE_ADD(UTC_DATE(),INTERVAL 90 DAY),INTERVAL NEW_REMINDER day) AS ACT_DUE_DT, 
         'D+0' AS rectyp 
FROM (
SELECT ID,
       TASK_ID,
       PATTERN,
       START_DT,
       EXP_DT,
       DAYS_OF_WEEK,
       REMINDER_DAYS_BEFORE,
       CASE
         WHEN WEEKDAY (DATE_ADD(UTC_DATE(),INTERVAL 90 DAY))=0 AND REMINDER_DAYS_BEFORE > 4 THEN REMINDER_DAYS_BEFORE +2
         WHEN WEEKDAY (DATE_ADD(UTC_DATE(),INTERVAL 90 DAY)) = 1 AND REMINDER_DAYS_BEFORE > 3 THEN REMINDER_DAYS_BEFORE +2
         WHEN WEEKDAY (DATE_ADD(UTC_DATE(),INTERVAL 90 DAY)) = 2 AND REMINDER_DAYS_BEFORE > 2 THEN REMINDER_DAYS_BEFORE +2
         WHEN WEEKDAY (DATE_ADD(UTC_DATE(),INTERVAL 90 DAY)) = 3 AND REMINDER_DAYS_BEFORE > 1 THEN REMINDER_DAYS_BEFORE +2
         WHEN WEEKDAY (DATE_ADD(UTC_DATE(),INTERVAL 90 DAY)) = 4 AND REMINDER_DAYS_BEFORE > 0 THEN REMINDER_DAYS_BEFORE +2
         ELSE REMINDER_DAYS_BEFORE
       END AS NEW_REMINDER
FROM OCC_ML_TASK_RECURRENCE
WHERE PATTERN = 'WEEKLY'
)W1
#WHERE start_dt <= DATE_ADD(UTC_DATE(),INTERVAL NEW_REMINDER DAY)
#AND   exp_dt >= date_add(UTC_DATE(),INTERVAL NEW_REMINDER DAY)
#AND   LOCATE(BINARY DAYNAME(DATE_ADD(UTC_DATE(),INTERVAL NEW_REMINDER DAY)),BINARY DAYS_OF_WEEK) > 0
)W2)W3
WHERE 
 LOCATE(BINARY DAYNAME(FNL_DUE_DT),BINARY DAYS_OF_WEEK) > 0 AND
 start_dt <= DATE_ADD(DATE_ADD(UTC_DATE(),INTERVAL 90 DAY),INTERVAL FINAL_REMINDER DAY)
AND   exp_dt >= date_add(DATE_ADD(UTC_DATE(),INTERVAL 90 DAY),INTERVAL FINAL_REMINDER DAY)

Я хотел бы знать, есть ли другой возможный способ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...