2009-08-05 2 views
3

Ich habe eine gespeicherte Funktion in MySQL:Gespeicherte Funktion in MySQL mag benutzerdefinierte Daten nicht?

CREATE FUNCTION `login_count`(o INT, start_date DATE, end_date DATE) RETURNS INT 
READS SQL DATA 
BEGIN 
DECLARE total_count INT; 
SELECT COUNT(*) INTO total_count FROM logins as l WHERE `order_id` = o && modified BETWEEN start_date AND end_date; 
RETURN total_count; 
END 

Ziemlich einfach, nimmt eine ID, Datum beginnen, und ein Enddatum und gibt die Anzahl der Anmeldungen für diesen Zeitraum. Immer wenn ich es laufe, bekomme ich eine 0 zurück. Es sei denn, ich entfernte den Datumsbereich der Where-Klausel. Dann gibt es die tatsächliche Zahl zurück. ODER wenn ich die Daten nur manuell in die gespeicherte Funktion einfüge, funktioniert das ... Es ist also kein Problem mit Datumsangaben, aber nur wenn ich die Daten über die Parameterliste liefere, mag es das nicht.

Irgendwelche Gedanken, was dazu führen könnte? Die Tatsache, dass ich die Daten einfach manuell in die gespeicherte Funktion schreiben kann und es funktioniert, nervt mich wirklich. Es ist nicht so, als würde hier viel passieren, was zu Verwirrung führen könnte, also bin ich irgendwie verloren, was ich als nächstes versuchen sollte.

Gibt es auch eine Möglichkeit, gespeicherte Funktionen/Prozeduren zu debuggen. Ich bekomme gerade eine 0 zurück, aber gibt es eine Möglichkeit für mich, dies zu debuggen, um herauszufinden, was passieren könnte?

Antwort

2

Meine erste Vermutung ist, dass Sie Daten in einem Format liefern, das MySQL nicht erkennt. MySQL ist ziemlich wählerisch in Bezug auf das Format von Datumsliteralen. Es möchte JJJJ-MM-TT, JJ-MM-TT, JJJJMMTT oder JJMMTT (Sie können auch jedes andere Satzzeichen anstelle der Bindestriche verwenden). Weitere Informationen finden Sie unter The DATETIME, DATE, and TIMESTAMP Types.

Sie können auch mehrere Datumsformate in das von MySQL akzeptierte Format mit der STR_TO_DATE()-Funktion konvertieren.

In Bezug auf das Debuggen gespeicherter Prozeduren und gespeicherter Funktionen können Sie immer eine benutzerdefinierte Variable mit dem Präfix @ festlegen, und diese Variable wird global verfügbar, nachdem die gespeicherte Funktion zurückgegeben wurde. Wie ein Nebeneffekt. Sie können damit Diagnoseinformationen beim Ausführen Ihrer gespeicherten Funktion festlegen und diese anschließend überprüfen.

+0

Danke für den Tipp, ich werde versuchen, das zu debuggen. Was das Date-Zeug betrifft, so nenne ich es. SELECT login_count (3250, '2009-05-31', '2009-06-31'); Welches ist das richtige Format, aber wer weiß, was passiert. Ich werde @ Sache ausprobieren und weitere Infos posten. –

+0

Heh, dein Kommentar ließ mich zurückgehen und an den Daten herumspielen. Ich habe YYYY-MM-31 immer am Ende eines Monats benutzt, und es hat immer funktioniert. Aber aus irgendeinem Grund in diesem Fall mochte es nicht 31 Tage im Juni :) –

+0

Heh! Nun, ich bin froh, wenn mein Vorschlag Ihnen geholfen hat, das wahre Problem zu bemerken. –

Verwandte Themen