Хранимая функция SQL для объединения имени и даты

#mysql #sql #stored-functions

#mysql #sql #хранимые функции

Вопрос:

Я пытаюсь закодировать хранимую функцию, которая принимает дату (2020-09-04) и имя, а затем возвращает строку, подобную дате рождения имени, 04 сентября 2020 года. Я начал с приведенного ниже и обнаружил проблему.

 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 ;
  

Комментарии:

1. Просмотрите функции даты здесь dev.mysql.com/doc/refman/8.0/en /…

2. MySQL не использует T-SQL. Только Sybase и MS SQL Server используют T-SQL.

3. Я отредактировал, чтобы заменить термин UDF на сохраненную функцию, потому что вы не пишете UDF. UDF — это термин MySQL для кода, который вы могли бы написать на C или C и скомпилировать его как расширение для сервера MySQL. Вы пишете хранимую функцию .

Ответ №1:

В вашем скрипте есть несколько проблем:

  • В первой строке есть одна скобка и слишком много типов данных (второй параметр).
  • Вы используете зарезервированное имя / ключевое слово ( month ) в качестве имени переменной без кавычек.
  • MONTH функция не поддерживает два параметра.
  • Не проблема, а рекомендация: используйте правильные имена переменных (не только 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(' ', name, 'Birthday is', DATE_FORMAT(birthday, '%b %d, %Y'))
FROM table_name
  

демонстрация на dbfiddle.uk

Ответ №2:

Вам нужно форматировать нужную вам дату, для этого вы должны использовать DATE_FORMAT, как предложил ПСалмон.

Не следует использоватьзарезервированные слова, такие как MONTH, что приведет к ошибке, как замечено, но для вашей цели проще использовать пользовательскую переменную, такую как @month

Использовать

 DELIMITER //
CREATE FUNCTION concatenate(X CHAR(24),Y date )
Returns CHAR(50)
DETERMINISTIC
BEGIN
declare _month char(20);
SELECT DATE_FORMAT(Y, '%b %d, %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, '%b %d, %Y') INTO @month;
Return concat(X, "'s Birthday is ", @month);
END//

DELIMITER ;