#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
Ответ №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 ;