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)
Я хотел бы знать, есть ли другой возможный способ