3

MySQL にストアド関数があります。

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

かなり基本的なもので、ID、開始日、終了日を受け取り、その日付範囲のログイン数を返します。実行するたびに、0が返されます。where句の日付セクションを削除しない限り。次に、実際の数値を返します。または、保存された関数に手動で日付を入れるだけでも機能します...したがって、日付の問題ではありませんが、パラメーターリストを介して日付を提供している場合にのみ、それは気に入りません。

これが起こる原因について何か考えはありますか?格納された関数に手動で日付を入れることができ、それが機能するという事実は本当に私を悩ませています。ここで台無しになる可能性のある多くのことが起こっているわけではないので、次に何をしようか迷っています。

また、保存された関数/手順をデバッグする方法はありますか。0 が返ってきましたが、これをデバッグして何が起こっているのかを調べる方法はありますか?

4

1 に答える 1

2

私の最初の推測は、MySQL が認識しない形式で日付を指定しているということです。MySQL は、日付リテラルの形式についてかなりうるさいです。YYYY-MM-DD、YY-MM-DD、YYYYMMDD、または YYMMDD が必要です (ダッシュの代わりに他の句読点を使用することもできます)。詳細については、DATETIME、DATE、および TIMESTAMP タイプを参照してください。

STR_TO_DATE()関数を使用して、より多くの日付形式を MySQL で受け入れられている形式に変換することもできます。

ストアド プロシージャとストアド関数のデバッグに関しては、@プレフィックスを使用してユーザー定義変数をいつでも設定できます。この変数は、ストアド関数が戻った後にグローバルに使用できるようになります。副作用みたいな。したがって、これを使用して、保存された関数の実行中に診断情報を設定し、後で確認できます。

于 2009-08-05T21:53:03.347 に答える