2016-09-05 3 views
0

У меня есть заявление IF THEN ELSE в одном из моих хранимых продуктов.Почему «INTERVAL» не является допустимым синтаксисом в инструкции IF

if (DAYOFWEEK((SELECT DATE_ADD(_todaydate, INTERVAL (_sign * offset.value) DAY)))=7) 
then 
     SELECT DATE_ADD(daytemp, INTERVAL (_sign * offset.value + 2) DAY) into `day`; 
elseif (DAYOFWEEK((SELECT DATE_ADD(_todaydate, INTERVAL _sign * offset.value DAY)))=1) 
then 
     SELECT DATE_ADD(daytemp, INTERVAL (_sign * offset.value + 1) DAY) into `day`; 
else 
     Select (SELECT DATE_ADD(_todaydate, INTERVAL _sign * offset.value DAY)) into `day`; 
END if; 

где _todaydate сегодняшняя дата, _sign либо +1 или -1 в зависимости от того, если вы хотите, чтобы найти дни в будущем или в прошлом и offset ряда ИНТ показывает, сколько дней от _todaydate.

Запрос предназначен для возврата меня рабочий день или в прошлом или в будущем в зависимости от _sign * offset.value, но проблема в том, что SQL возвращает мне ошибку, говоря, что "unexpected INTERVAL (interval) in the if statement"

Я не знаю, почему я получаю эту проблему потому что сам запрос выглядит хорошо. Может кто-нибудь смотрите, что мне не хватает ...

Дополнительная информация:

Я это IF заявление в «Select From» заявление, что могли бы быть случай, что эта ошибка происходит?

ответ

1

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

DECLARE _dow INT; 
    DECLARE _inc INT; 

    SELECT DAYOFWEEK(DATE_ADD(_todaydate, INTERVAL (_sign * offset.value) DAY)) INTO _dow ; 

    CASE _dow 
    WHEN 7 THEN SET _inc = 2; 
    WHEN 1 THEN SET _inc = 1; 
    ELSE  SET _inc = 0; 
    END CASE; 

    SELECT DATE_ADD(daytemp, INTERVAL (_sign * offset.value + _inc) DAY) INTO `day`; 

Чтобы ответить на вопрос, который вы просили «почему ИНТЕРВАЛ не является допустимым синтаксисом в IF заявлении» ...

Я не в курсе каких-либо ограничений в MySQL хранимой программы, которые запрещают использование ключевого слова INTERVAL в пределах IF. Очевидно, что ключевое слово INTERVAL не является частью конструкции IF; ключевое слово действует только в контексте некоторых выражений.


Followup

Я заметил, что переписывание выше не эквивалентно оригиналу. В оригинале, в условиях ELSE, это DATE_ADD(_todaydate,. Это отличается от двух других условий, где это DATE_ADD(daytemp

Незначительное переписана, чтобы приспособить эту разницу, добавив еще одну переменную _bdt, позволяет нам по-прежнему использовать только два ЗЕЬЕСТ ...

DECLARE _bdt DATE; 
    DECLARE _dow INT; 
    DECLARE _inc INT; 

    SELECT DAYOFWEEK(DATE_ADD(_todaydate, INTERVAL (_sign * offset.value) DAY)) INTO _dow ; 

    CASE _dow 
    WHEN 7 THEN 
     SET _inc = 2; 
     SET _bdt = daytemp; 
    WHEN 1 THEN 
     SET _inc = 1; 
     SET _bdt = daytemp; 
    ELSE 
     SET _inc = 0; 
     SET _bdt = _todaydate; 
    END CASE; 

    SELECT DATE_ADD(_bdt, INTERVAL (_sign * offset.value + _inc) DAY) INTO `day`; 
+0

Привет, spencer7593, спасибо за ваше предложение, я думаю, что вы предлагаете лучше, спасибо, я попробую это. – Nia

+0

Одна проблема с кодом в моем ответе выше. Я замечаю, что в оригинале это 'DATE_ADD (_todaydate, ...)', который отличается от 'DATE_ADD (daytemp, ...)' в двух других условиях. Я пропустил это в своем переписывании. (Непонятно, почему это было бы иначе. Если это так, то я бы добавил другую переменную процедуры и назначил либо «daytemp», либо «_todaydate» в условном тесте, а затем ссылался на новую переменную только один SELECT, чтобы получить «день». – spencer7593

3

не Если ваш IF заявление, как показано ниже

if (SELECT DAYOFWEEK(DATE_ADD(_todaydate, INTERVAL (_sign * offset.value) DAY))=7) 

Кроме того, я вижу, что вы повторяете такое же условие несколько раз, в конечном счете, выполнив тот же запрос несколько раз. Вместо этого этот запрос выполняется раньше и сохраняет значение в локальной переменной и вместо этого использует эту локальную переменную в условном выражении; что было бы очень эффективно.

+0

Привет Рахул, спасибо за предложения, хорошая точка, я попробую это, спасибо снова :) – Nia