2016-06-22 12 views
0

Ich versuche, einen Endtermin zu erhalten, wenn eine Anzahl von Tagen (pplazo Eingang) abgelaufen ist, auf einem Datum beginnen (pfecha Eingang), und die Vermeidung von um bestimmte Daten zu zählen (feriado), die in einer Tabelle aufgeführt sind.MySQL versagt Tage zu einem Datum hinzuzufügen, wenn Monat über

Bisher ist es das, was ich habe, um eine gespeicherte Prozedur:

Eingangsparameter:

pfecha - DATUM

pplazo - INT (11)

PROC:BEGIN 

DECLARE i INT(1); 

START TRANSACTION; 

SET i=1; 

lazo:LOOP 
    IF NOT EXISTS (SELECT * FROM feriados WHERE feriado=pfecha+i) 
     THEN 
     SET pfecha=pfecha+1; 
     SET i=i+1; 
    END IF; 

    IF i=pplazo 
     THEN 
     LEAVE lazo; 
    END IF; 
END LOOP lazo; 

COMMIT; 

SELECT pfecha as respuesta; 

END 

Die Sache ist, wenn die Tage zu zählen, um das Datum gehen das Ende des Monats gehen, dann die "respe sta "wendet sich an 0000-00-00. Dies sollte nicht passieren, wenn ich 15 Tage ab dem 2016-04-20 eingeben, dann sollte das resultierende Datum etwa 2016-05-5 sein.

Können Sie meinen Fehler erkennen? Könnten Sie mir in die richtige Richtung zeigen?

+1

Verwenden Sie 'DATE_ADD (pfecha, INTERVALL 1 DAY)'. – Barmar

+0

Möchtest du wirklich 1 zu "pfecha" und "i" hinzufügen? Das wird Ihre Abfrage jedes Mal um 2 Tage durch die Schleife springen lassen. – Barmar

+0

@Drew das ist weil ich am Ende keine ihrer Antworten verwendet ... sollte ich die beste Antwort trotzdem wählen? peinlich. – GonHL

Antwort

1

Die korrekte Methode zum Hinzufügen einer Anzahl von Tagen zu einem Datum ist mit den DATE_ADD oder ADDATE Funktionen, nicht die + Operator. Siehe

lazo:LOOP 
    IF NOT EXISTS (SELECT * FROM feriados WHERE feriado=DATE_ADD(pfecha, INTERVAL i DAY)) 
     THEN 
     SET pfecha=DATE_ADD(pfecha, INTERVAL 1 DAY); 
     SET i=i+1; 
    END IF; 

    IF i=pplazo 
     THEN 
     LEAVE lazo; 
    END IF; 
END LOOP lazo; 
Verwandte Themen