0

このspの何が問題なのか誰か教えてください。ロジックは問題ないようですが、テーブルに戻って確認すると、まったく機能しません。

    DELIMITER //
DROP PROCEDURE IF EXISTS add_zero_yearly_sales_proc //
CREATE PROCEDURE add_zero_yearly_sales_proc() 
READS SQL DATA
BEGIN 

DECLARE num_of_sales INT DEFAULT 0;
DECLARE last_ins_date DATETIME;
DECLARE done INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

SET last_ins_date = DATE_SUB(NOW(), INTERVAL 2 YEAR);

ins_loop: WHILE last_ins_date < NOW() DO
SELECT COUNT(sales_amount_sold) INTO num_of_sales
FROM yearly_sales
WHERE sales_date_sold BETWEEN DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01') AND DATE_FORMAT(LAST_DAY(last_ins_date),'%Y-%m-%d 23:59:59');

IF num_of_sales = 0 THEN  

INSERT INTO yearly_sales(sales_date_sold, sales_amount_sold,sales_quantity) 
VALUES (CONCAT(DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01')),0, 0);

END IF ;

SET num_of_sales = 0;
SET last_ins_date = DATE_ADD(last_ins_date, INTERVAL 1 MONTH);

END WHILE ins_loop;
SET done = 0;

END ;//
DELIMITER ;

このプロシージャを呼び出すために、1 時間ごとに発生するイベントを作成しました。この手順では、 yearly_sales テーブルに売上値のない月があるかどうかを確認し、ある場合は金額と数量に 0 の値を追加し、日付に月の初めを追加します。再度確認しましたが、うまくいかないようです。

また、これは私が毎時呼び出すために作成したイベントです

    DELIMITER //  
CREATE    
EVENT `hourly_sales_evt`  
ON SCHEDULE EVERY 1 HOUR STARTS DATE_FORMAT(NOW(),'%Y-%m-%d %H:55:00')
ON COMPLETION PRESERVE
DO BEGIN 
    CALL add_zero_yearly_sales_proc();
END //
DELIMITER ;
4

3 に答える 3

1

グローバル イベント スケジューラが停止/無効状態になっている可能性があります。

イベント スケジューラをオンにするには、次のいずれかを実行します。

SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@global.event_scheduler = 1;

イベント スケジューラがオンの場合、イベント スケジューラ スレッドは の出力にSHOW PROCESSLISTデーモン プロセスとしてリストされ、その状態は次のように表されます。

mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
     Id: 1
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: show processlist
*************************** 2. row ***************************
     Id: 2
   User: event_scheduler
   Host: localhost
     db: NULL
Command: Daemon
   Time: 3
  State: Waiting for next activation
   Info: NULL
2 rows in set (0.00 sec)

Event Scheduler がオンに設定されると、それが機能していることがわかります。

参照: MySQL イベント スケジューラの設定

于 2012-06-27T14:55:14.717 に答える
1

手順は問題ないように見えます。ロジックは機能するはずです。しかし、お聞きしたいのですが、なぜsales_date_sold最初の 1 秒目からチェックするDATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01')のですか? DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:00') ではないでしょうか?

もう1点:ループ内でSELECT文を何度も実行すると効果がありません。月番号を使用して追加の (おそらく一時テーブル) を作成し、2 つのテーブルを結合して、売上のない月を見つけてみてください。この場合、1 つのステップで結果が得られます。

于 2012-06-27T14:09:23.243 に答える
0

ここではあまり掘り下げずに推測していますが、これはあなたの問題だと思います:

READS SQL DATA
...
INSERT INTO yearly_sales(sales_date_sold, sales_amount_sold,sales_quantity) 
VALUES (CONCAT(DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01')),0, 0);
于 2012-06-27T14:05:24.230 に答える