3

私のストアドプロシージャコードを見てください。

CREATE DEFINER=`ninjaboy`@`%` PROCEDURE `getMonthlyTotalScore`(IN ninjaId int,  IN month int, IN year int)
BEGIN
    DECLARE startDate DATE;
    DECLARE endDate DATE;
    DECLARE maxDay INTEGER;

    SELECT DAY(LAST_DAY(year + '-' + month + '-01')) INTO maxDay;

    SET startDate = year + '-' + month + '-01';
    SET endDate = year + '-' + month + '-' + maxDay;

    SELECT SUM(SCORE) FROM NINJA_ACTIVITY WHERE NINJA_ID = ninjaId AND DATE BETWEEN startDate AND endDate ORDER BY DATE;
END

テストデータ:

NINJA_ACTIVITY_ID | 忍者ID | スコア | 日にち
1 1 24 2012-05-01
2 1 36 2012-05-06
3 1 29 2012-05-11

関数呼び出し:call getTotalMonthlyScore (1, 5, 2012)

に基づいて忍者の月間スコアを取得しようとしていninjaIdます。

なぜ機能しないのですか?私が間違っているところはありますか?

4

3 に答える 3

12

CONCAT() が鍵です。

前:

mysql> CREATE  PROCEDURE `getMonthlyTotalScore`(IN ninjaId int,  IN month int, IN year int)
        -> BEGIN
        ->     DECLARE startDate DATE;
        ->     DECLARE endDate DATE;
        ->     DECLARE maxDay INTEGER;
        -> 
        ->     SELECT year + '-' + month + '-01'; #NOTE THIS
        -> 
        ->     
        -> END;    
        -> |
    Query OK, 0 rows affected (0.00 sec)

    mysql> call getMonthlyTotalScore(1,5,2012);
        -> |
    +----------------------------+
    | year + '-' + month + '-01' |
    +----------------------------+
    |                       2016 |
    +----------------------------+
    1 row in set (0.00 sec)

後:

mysql> CREATE  PROCEDURE `getMonthlyTotalScore`(IN ninjaId int,  IN month int, IN year int)
    -> BEGIN
    ->     DECLARE startDate DATE;
    ->     DECLARE endDate DATE;
    ->     DECLARE maxDay INTEGER;
    -> 
    ->     SELECT CONCAT(year,'-',month,'-01'); # NOTE THIS
    -> 
    ->     
    -> END;    |
Query OK, 0 rows affected (0.00 sec)

mysql> call getMonthlyTotalScore(1,5,2012);
    -> |
+------------------------------+
| CONCAT(year,'-',month,'-01') |
+------------------------------+
| 2012-5-01                    |
+------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
于 2012-05-21T07:49:38.747 に答える
3

それ以外の:

SELECT DAY(LAST_DAY(year + '-' + month + '-01')) INTO maxDay;

で置き換えます

SET maxDay := DAY(LAST_DAY(CAST(CONCAT(year, '-',month,'-01) as DateTime)));
于 2012-05-21T07:48:40.873 に答える
0

ベックの答えからアイデアを得た後、私はこの実用的な解決策を持っています。

CREATE DEFINER=`ninjaboy`@`localhost` PROCEDURE `getMonthlyTotalScore`(IN ninjaId int,  IN month int, IN year int)
BEGIN
    DECLARE startDate DATE;
    DECLARE endDate DATE;
    DECLARE maxDay INTEGER;

    SELECT DAY(LAST_DAY(CONCAT(year,'-',month,'-01'))) INTO maxDay;

    SET startDate =  CONCAT(year,'-',month,'-01');
    SET endDate = CONCAT(year,'-',month,'-',maxDay);

    SELECT SUM(SCORE) FROM NINJA_ACTIVITY WHERE NINJA_ID = ninjaId AND DATE BETWEEN startDate AND endDate ORDER BY DATE;
END
于 2012-05-21T08:15:33.383 に答える