鉴于此功能:
DROP FUNCTION IF EXISTS expiration_date;
DELIMITER $$
CREATE FUNCTION expiration_date(lic_class VARCHAR(2), born_on DATE, at DATE) RETURNS DATE
BEGIN
DECLARE age INTEGER;
DECLARE span INTEGER DEFAULT 0;
SET age = YEAR(at) - YEAR(born_on);
IF age < 50 THEN SET span = 10;
ELSEIF age >= 50 AND age < 70 THEN SET span = 5;
ELSEIF age >= 70 AND age < 80 THEN SET span = 3;
ELSEIF age >= 80 THEN SET span = 2;
END IF;
DECLARE ret DATE;
SET ret = DATE_ADD(at, INTERVAL span YEAR);
RETURN ret;
END $$
DELIMITER ;
它给了我:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE ret DATE; SET ret = DATE_ADD(at, INTERVAL span YEAR); RETURN' at line 12
这是为什么呢?我错过了什么?
最佳答案
根据to the DECLARE
documentation
DECLARE
is permitted only inside aBEGIN ... END
compound statement and must be at its start, before any other statements.
因此,将DECLARE ret DATE;
放在IF...ELSE
block 之后是无效的。将其与其他 DECLARE
声明一起移至顶部。
DROP FUNCTION IF EXISTS expiration_date;
DELIMITER $$
CREATE FUNCTION expiration_date(lic_class VARCHAR(2), born_on DATE, at DATE) RETURNS DATE
BEGIN
DECLARE age INTEGER;
DECLARE span INTEGER DEFAULT 0;
-- No reason not to DECLARE up here!
DECLARE ret DATE;
SET age = YEAR(at) - YEAR(born_on);
IF age < 50 THEN SET span = 10;
ELSEIF age >= 50 AND age < 70 THEN SET span = 5;
ELSEIF age >= 70 AND age < 80 THEN SET span = 3;
ELSEIF age >= 80 THEN SET span = 2;
END IF;
SET ret = DATE_ADD(at, INTERVAL span YEAR);
RETURN ret;
END $$
DELIMITER ;
关于mysql - DATE_ADD 和 INTERVAL 函数中的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24582112/