2017-03-26 10 views
0

SP &を使用して各日付の結果を取得しようとしています。ループを使用しており、SQL文をunion allを使用して追加していますが、可変日付の最終値を取ります。ストアドプロシージャmysqlで間違った結果が出る

表:

CREATE TABLE `bugs` (
    `id` int(11) DEFAULT NULL, 
    `severity` int(11) DEFAULT NULL, 
    `open_date` date DEFAULT NULL, 
    `close_date` date DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

SP:

DELIMITER $$ 
DROP PROCEDURE IF EXISTS search$$ 
CREATE PROCEDURE search(startDate DATE, endDate DATE) 
    BEGIN 
     DECLARE result VARCHAR(255); 
     SET @iterDate = DATE(startDate); 
     SET @result = ''; 
     label1: LOOP 
      SET @result = CONCAT(@result, ' SELECT DATE(@iterDate), count(*) FROM bugs WHERE open_date = DATE(@iterDate) AND close_date > DATE(@iterDate) UNION ALL'); 
      SET @iterDate = DATE_ADD(@iterDate, INTERVAL 1 DAY); 
      IF @iterDate <= DATE(endDate) THEN 
       ITERATE label1; 
      END IF; 
      LEAVE label1; 
     END LOOP label1; 
     SET @result = LEFT(@result, LENGTH(@result)-LENGTH('UNION ALL')); 
     PREPARE stmt FROM @result; 
     EXECUTE stmt; 
    END$$ 
DELIMITER ; 

これは、それぞれの日の日付範囲とレコード数がかかります。私の中では最後に形成されたクエリを実行するために最後の日付(endDate + 1)を取っています。

+0

プロシージャの代わりに、私はカレンダーテーブルとLEFT JOINを使用します。 –

答えて

0

@iterDateインクリメント(SETコマンド)と@iterDate条件チェック(IFコマンド)の順序を変更するだけです。

+0

これはループを無限にします。 – cody123

+0

今は試してみることはできませんが、反復処理の直前にIFブロック内にインクリメンタを追加するだけです。 – user88748

+0

はい、最後に値を更新していますが、追加中ではなく、終了+ 1です。ここで何が間違っているのですか? – cody123

関連する問題