2009-08-05 7 views
3

私はMySQLでの保存機能があります、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を得ていますが、何が起こっているのかを試してみるためにこれをデバッグする方法がありますか?

答えて

2

私が最初に推測するのは、MySQLが認識できない形式で日付を提供しているということです。 MySQLは、日付リテラルのフォーマットについてはかなり嫌です。 YYYY-MM-DD、YY-MM-DD、YYYYMMDD、またはYYMMDDが必要です(ダッシュの代わりに他の句読文字も使用できます)。詳細については、The DATETIME, DATE, and TIMESTAMP Typesを参照してください。

STR_TO_DATE()機能を使用して、より多くの日付形式をMySQLが受け入れ可能な形式に変換することもできます。

デバッグのストアド・プロシージャとストアド・ファンクションについて、あなたは常に@接頭辞を持つユーザ定義の変数を設定することができ、そしてこの変数は、格納された関数が戻った後、世界的に利用できるようになります。副作用のように。したがって、これを使用してストアドファンクションを実行している間に診断情報を設定し、後でチェックすることができます。

+0

チップをありがとう、私はこれをデバッグしようとします。ここの日付のものは、私がそれをどう呼んでいるかです。 SELECT login_count(3250、 '2009-05-31'、 '2009-06-31'); これは正しいフォーマットですが、何が起こっているかを知っています。私は少し物事を試して、より多くの情報を投稿します。 –

+0

Heh、あなたのコメントは、私に戻って、日付とバイリンガルにしました。私は月末にYYYY-MM-31を使い続けていましたが、それはいつも働いていました。しかし、この例で何らかの理由で6月に31日が好きではなかった:) –

+0

Heh!私の提案が本当の問題に気付くのを助けてくれたら嬉しいです。 –

関連する問題