我有一个应始终设置日期的程序,但它没有:
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);
日期设置正确。
我不会对我做错了什么。
由于
答案 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
。