问题描述
我正在尝试对存储的函数进行编码,该函数接受日期(2020-09-04)和名称,然后返回一个字符串,例如名称生日是2020年9月4日。我从下面开始查找问题。
DELIMITER //
CREATE FUNCTION concatenate(X CHAR(24),Y date date))
Returns CHAR(50)
BEGIN
declare month char(20);
SELECT month(date,%m) into month;
Return concat(X,'Birthday is',' ',month);
END//
DELIMITER ;
解决方法
您的脚本存在多个问题:
- 第一行(第二个参数)有很多括号和数据类型。
- 您正在使用reserved name / keyword(
month
)作为变量名而不引用。 -
MONTH
function不支持两个参数。 - 不是问题,而是建议:使用适当的变量名(不仅仅是
X
和Y
)。
您可以使用此功能:
CREATE FUNCTION concatenate(name CHAR(24),birthday DATE)
RETURNS CHAR(50)
BEGIN
RETURN CONCAT_WS(' ',name,'Birthday is',DATE_FORMAT(birthday,'%b %d,%Y'));
END
您可以使用以下功能:
-- simple example
SELECT concatenate('Tim',now()); -- Tim Birthday is Sep 04,2020
-- or
SELECT concatenate(name,birthday)
FROM table_name
但是您也可以直接在SELECT
语句上使用逻辑,而无需使用UDF:
SELECT CONCAT_WS(' ',%Y'))
FROM table_name
,
您需要格式化所需的日期,因为您必须像PSalmon建议的那样使用DATE_FORMAT。
Reserved words之类的MONTH不应使用,这将引起错误,但出于您的目的,使用用户定义的变量如@month
更简单使用
DELIMITER //
CREATE FUNCTION concatenate(X CHAR(24),Y date )
Returns CHAR(50)
DETERMINISTIC
BEGIN
declare _month char(20);
SELECT DATE_FORMAT(Y,%Y') INTO _month;
Return concat(X,"'s Birthday is ",_month);
END//
DELIMITER ;
结果
# concatenate('temp','2020-01-01')
temp's Birthday is Jan 01,2020
或者您使用
DELIMITER //
CREATE FUNCTION concatenate(X CHAR(24),Y date )
Returns CHAR(50)
DETERMINISTIC
BEGIN
SELECT DATE_FORMAT(Y,%Y') INTO @month;
Return concat(X,@month);
END//
DELIMITER ;