1

毎月の過去6か月間にラジオで曲が再生された合計時間を見つける必要があるストアドプロシージャを作成する必要があります。つまり、6か月前まで、今月、先月など、6つの出力があります。これを行うには、Track_noのstart_airtimeとfinish_airtimeを使用する必要があります。これらの合計は私に合計放送時間を与え、個々の月ごとに区切る必要があり、出力には2つの列が含まれている必要があります。最初は月の名前、次に放送された合計時間です。

開始放送時間と終了放送時間は曲の長さですが、これら2つの値から導出するために使用できるこの情報がありません。

私のテーブルの設定は次のとおりです。

track_no TINYINT(3) UNSIGNED
genre VARCHAR(60)
purchasedate DATE NOT NULL
start_airtime TIME NOT NULL
finish_airtime TIME
artist CHAR(9)

私はストアドプロシージャについて完全に無知なので、どんな情報でもありがたいです。どうもありがとう。

これまでのところ私のコードは:

DELIMITER //
DROP PROCEDURE IF EXISTS airtime_of_month//
CREATE PROCEDURE airtime_of_month(IN track_input TINYINT) 
BEGIN
        DECLARE x, track_num TINYINT;
        DECLARE totalTime VARCHAR(25);
        SET x = 7;
        SET track_num = track_input;
        WHILE x > 1 DO
                    SET x = x - 1;
                    SELECT track_no INTO track_num
                            FROM Radio
                            WHERE track_input = track_no;
                    IF (track_input IS NULL) THEN
                            SELECT CONCAT(track_input, ' Is Not                               
                                                           A Valid Track Number') as _;
                ELSE 
                       SELECT track_no,   
             CONCAT(FLOOR(HOUR(TIMEDIFF(finish_airtime,start_airtime)) / 24), ' days ',
                 MOD(HOUR(TIMEDIFF(finish_time,start_airtime)), 24), ' hrs ',                                
          MINUTE(TIMEDIFF(finish_airtime,start_airtime)), ' minutes ') AS total_AirTime
                FROM Radio
                WHERE DATE_SUB(MONTH(purchasedate), INTERVAL x   
                                                                               MONTH);
                END IF;
                SELECT track_num;
    END WHILE;
END //

CALL airtime_of_month (2)/ 
DELIMITER ;

しかし、私がこれを行うと、コンパイルは行われますが、何も返されません。何か案は?

4

2 に答える 2

1

関数の例:

DROP FUNCTION IF EXISTS test;

DELIMITER $$
CREATE FUNCTION test(in_number INT) RETURNS INT
    BEGIN
        DECLARE countTotal INT;
        SET countTotal = SELECT COUNT(*) FROM nGrams;
    RETURN countTotal + in_number;
END $$
DELIMITER ;

手順の例:

DROP PROCEDURE IF EXISTS cron_scrubber;

DELIMITER $$
CREATE PROCEDURE cron_scrubber()
BEGIN

    INSERT INTO driver_car_ready_history (id_driver_car_ready, status, date_register, id_driver_car, id_job) 
    SELECT dcr.id_driver_car_ready, dcr.status, dcr.date_register, dcr.id_driver_car, dcr.id_job 
    FROM driver_car_ready dcr 
    ORDER BY dcr.id_driver_car_ready;

    TRUNCATE TABLE driver_car_ready;

END $$
DELIMITER ;

少しお役に立てば幸いです。

于 2012-12-02T19:49:10.590 に答える
0

まず、どうしても必要な場合を除いて、ストアドプロシージャを使用しないでください(ちなみに、このような場合はほとんどありません)。

ストアドプロシージャを使用すべきでないいくつかの理由については、この回答を参照してください。

これは、SQLコードのモジュール性が必要な場合は、ビューに「パッケージ化」できる非常に単純なクエリで実行できます。

create view track_airtime as
select
    track_no, 
    extract(YEAR_MONTH from purchasedate) as year_month, 
    sum(minute(TIMEDIFF(finish_airtime, start_airtime))) as total_airtime
from mytable
where extract(YEAR_MONTH from purchasedate) >= 
      extract(YEAR_MONTH from subdate(now(), interval 6 month))
and track_no = ?
group by 1, 2
order by 2 desc
于 2012-12-02T19:22:28.820 に答える