Ошибка в функции возврата

#mysql

#mysql

Вопрос:

Прошу прощения, если это кажется очень расплывчатым, но я не уверен, как еще это сформулировать. Я разработал функцию, которая, если день либо суббота, либо воскресенье, предвосхищает или откладывает уплату налогов. Следующий код:

 DELIMITER $
create function ajustavencimento (ano int, mes int, imposto char(6)) returns varchar(10) 
begin
  declare vencimento datetime;
  declare dia int;
  declare diaPIS int;
  declare ajustePIS varchar(50);

  if (mes = 12) then
  begin
    set mes = 1;
    set ano = ano   1;
  end; else
  begin
    set mes = mes   1;
  end;
  end if;    

  if (imposto = 'PIS') then
  begin
    select pisvencimento into diaPIs from pis; 
    select pisajuste into ajustePIS from pis; 
    set vencimento = cast(concat(cast(ano as char(4)),'-',cast(mes as char(2)),'-',cast(diaPIS as char(2))) as datetime);

    set dia = date_format(vencimento,'%w');
    if(dia = 0) then 
    begin
      if (ajustePIS = 'Antecepiar') then
        set vencimento = date_sub(vencimento, interval 2 day);
      end if;
      if (ajustePIS = 'Adiar') then
        set vencimento = date_add(vencimento, interval 1 day);
      end if;              
    end;
    end if;

    if(dia = 6) then 
    begin
      if (ajustePIS = 'Antecepiar') then
        set vencimento = date_sub(vencimento, interval 1 day);
      end if;
      if (ajustePIS = 'Adiar') then
        set vencimento = date_add(vencimento, interval 2 day);
      end if;              
    end;
    end if;
  end;
  end if;    
  return date_format(vencimento,'%d/%m/%Y');
end
  

Функция всегда возвращает дату

 25/02/2013 - OK
25/03/2013 - OK
25/04/2013 - OK
25/05/2013 - NOT (MUST RETURN 27/05/2013)
25/06/2013 - OK
  

Комментарии:

1. Каковы значения pisvencimento и pisajuste? например, что находится в pis? Можете ли вы добавить несколько комментариев на английском языке, объясняющих, что пытаются сделать различные части кода? Каковы значения всех параметров, с которыми вы вызываете функцию?

2. Вместо date_format(vencimento, '%w') вы можете использовать dayofweek(vencimento) . Просто помните, что он использует Sunday = 1, а не 0.

3. 25/05/2013 сегодня суббота. Ваша функция настраивается только для воскресенья.

4. @Dijkgraaf, pisvencimento = день месяца, выбранный для уплаты налога (25); ajustePIS = информация для отсрочки или авансового платежа («ожидает» или «отсрочка»). PIS = название налога в Бразилии.

5. проблема вполне может быть в таблице pis, несоответствие с pisvencimento и / или pisajuste; вы проверили, что строка за май / 2013 верна в этой таблице?