2011-04-08 3 views
1

L'affiche de première fois apprécie vraiment toute aide.MySQL La procédure avec la date IN échoue

Je suis complètement bloqué sur un problème avec les procédures stockées MySQL et complètement vert pour eux.

Voici la procédure telle qu'elle est actuellement écrite, MySQL l'accepte sans aucun problème, donc à moins d'une erreur de syntaxe, la procédure est écrite correctement.

Cependant quand j'appelle la procédure call test (2011-04-01, 2011-04-07); aucun résultat sont retournés, mais l'instruction select fonctionne très bien.

CREATE PROCEDURE `NewProc`(IN `@StartDate` date,IN `@EndDate` date) 

BEGIN 

SELECT aux1, aux2, aux3, aux4, date, id, type, 
    CASE 
     WHEN results = 'pass' THEN '1' 
     WHEN results = 'fail' THEN '0' 
     ELSE '-1' 
    END AS CertStatus, 
    CASE 
     WHEN results = 'pass' THEN '1' 
     WHEN results = 'fail' THEN '0' 
     ELSE '-1' 
    END AS TestStatus, 
    CASE 
     WHEN results = 'pass' THEN '1' 
     WHEN results = 'fail' THEN '0' 
     ELSE '-1' 
    END AS TestStatus, 
    CASE 
     WHEN results = 'pass' THEN '1' 
     WHEN results = 'fail' THEN '0' 
     ELSE '-1' 
    END AS TestStatus 
from completed 
WHERE date >= '@StartDate' and date <= '@EndDate'; 
END; 

Répondre

2

rapide ranger - je vais laisser à « @You » pour repérer les « différences » et il y a plus de « 1 »

delimiter ; 

drop procedure if exists list_test_status; 

delimiter # 

create procedure list_test_status 
(
in p_start_date date, 
in p_end_date date 
) 
begin 

select aux1, aux2, aux3, aux4, date, id, type, 
case 
    when results = 'pass' then 1 
    when results = 'fail' then 0 
    else -1 
end as CertStatus, 
case 
    when results = 'pass' then 1 
    when results = 'fail' then 0 
    else -1 
end as TestStatus, 
case 
    when results = 'pass' then 1 
    when results = 'fail' then 0 
    else -1 
end as TestStatus, 
case 
    when results = 'pass' then 1 
    when results = 'fail' then 0 
    else -1 
end as TestStatus 
from 
completed 
where 
date >= p_start_date and date <= p_end_date; 

end# 

delimiter ; 

call list_test_status(curdate() - interval 1 month, curdate()); 
+0

Merci f00, cela a résolu mon problème. – wolfsburg18

0

Les dates doivent être passés entre guillemets

call test ('2011-04-01', '2011-04-07'); 

modifier. Pourquoi appelez-vous test si votre procédure stockée s'appelle NewProc?

+0

Merci pour la réponse rapide, malheureusement, cela ne renvoie toujours aucun résultat. – wolfsburg18

+0

Avez-vous essayé d'exécuter la requête sans la procédure stockée en utilisant les mêmes deux dates? Etes-vous sûr qu'il y a des records dans cette gamme? En outre, essayez de supprimer les citations autour de @StartDate et @EndDate –

+0

Je ne comprends même pas la signification de tous ces cas. Je ne les ai pas noté auparavant. Vous les appliquez toujours aux mêmes valeurs et les répétez plusieurs fois. C'est inutile. –

0

Ne pas citer les variables, sinon il est un date non valide (la chaîne '@xxx' ne peut pas être convertie en date).
Ne pas reculer les paramètres
Vous renvoyez aussi TestStatus 3 fois ... des trucs fous!

CREATE PROCEDURE `NewProc`(IN StartDate date,IN EndDate date) 
BEGIN 

SELECT aux1, aux2, aux3, aux4, date, id, type, 
    CASE 
     WHEN results = 'pass' THEN '1' 
     WHEN results = 'fail' THEN '0' 
     ELSE '-1' 
    END AS CertStatus, 
    @cache := CASE 
     WHEN results = 'pass' THEN '1' 
     WHEN results = 'fail' THEN '0' 
     ELSE '-1' 
    END AS TestStatus, 
    @cache AS TestStatus, # 2nd time ? 
    @cache AS TestStatus # 3rd time ?? 
from completed 
WHERE date >= StartDate and date <= EndDate; 
END; 
Questions connexes