SQL存储函数来连接名称和日期

问题描述

我正在尝试对存储的函数进行编码,该函数接受日期(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 / keywordmonth)作为变量名而不引用。
  • MONTH function不支持两个参数。
  • 不是问题,而是建议:使用适当的变量名(不仅仅是XY)。

您可以使用此功能:

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

demo on dbfiddle.uk

,

您需要格式化所需的日期,因为您必须像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 ;