日期未设定

时间:2014-08-23 14:56:10

标签: mysql sql stored-procedures

我有一个应始终设置日期的程序,但它没有:

CREATE PROCEDURE 'player_extend_membership` (pid INTEGER, daysToAdd INTEGER, OUT result INTEGER)
BEGIN
SELECT PlayerMembershipEndDate INTO @memDate FROM players WHERE players.PlayerID = pid LIMIT 1;
SELECT ROW_COUNT() INTO @num;

IF @num = 0 THEN
    SET result = -1;
ELSE

    IF @memDate = NULL OR DATE(@memDate) < DATE(NOW()) THEN
        SET @finalDate = DATE_ADD(DATE(NOW()), INTERVAL daysToAdd DAY);
    ELSE
        SET @finalDate = DATE_ADD(DATE(@memDate), INTERVAL daysToAdd DAY);
    END IF;

SELECT @finalDate, @memDate;
UPDATE players SET PlayerMembershipEndDate = @finalDate
WHERE players.PlayerID = pid;
SET result = 1;
END IF;
END

当我检查返回值时,它是1,因此该帐户确实存在。它告诉我,select查询的结果始终是@finalDate为NULL。

但是,如果将其从IF中取出并且只是这样做:

SET @finalDate = DATE_ADD(DATE(NOW()), INTERVAL daysToAdd DAY);

日期设置正确。

我不会对我做错了什么。

由于

1 个答案:

答案 0 :(得分:1)

你的程序似乎太复杂了。也许这就是你想要的:

set @result = -1;
UPDATE players
    SET PlayerMembershipEndDate = (case when (@result := 1) is null then NULL
                                        when @memDate IS NULL OR DATE(@memDate) < DATE(NOW())
                                        then DATE_ADD(DATE(NOW()), INTERVAL daysToAdd DAY)
                                        else DATE_ADD(DATE(@memDate), INTERVAL daysToAdd DAY)
                                   end)
    WHERE players.PlayerID = pid;

如果找到一行,case中的第一个条件就会设置@result。尽管DATE(NOW())更简洁,但我已经离开了CURDATE()的表述。

我怀疑你的逻辑的实际问题是= NULL。这总是返回&#34; UNKNOWN&#34;,被视为false。正确的表达式是is NULL