我在 MySQL 版本中编写了这个 SP:8.0.34(MySQL 社区服务器 - GPL)在 docker 中运行
CREATE DEFINER=`root`@`%` PROCEDURE `SearchEvents`(IN P_team_id INT, IN P_event_name VARCHAR(255), IN P_event_start_date DATE, IN P_event_end_date DATE)
BEGIN
DECLARE mainQuery VARCHAR(1000);
SET @mainQuery = 'SELECT * FROM events WHERE 1';
IF P_team_id IS NOT NULL AND P_team_id <> '' THEN
SET @mainQuery = CONCAT(mainQuery, ' AND team_id = ', P_team_id);
END IF;
IF P_event_name IS NOT NULL AND P_event_name <> '' THEN
SET @mainQuery = CONCAT(mainQuery, ' AND (event_name_en LIKE "%', P_event_name, '%" OR event_name_ar LIKE "%', P_event_name, '%")');
END IF;
IF P_event_start_date IS NOT NULL AND P_event_start_date <> '' THEN
SET @mainQuery = CONCAT(mainQuery, ' AND event_start_date >= \'', P_event_start_date,'\'');
END IF;
IF P_event_end_date IS NOT NULL AND P_event_end_date <> '' THEN
SET @mainQuery = CONCAT(mainQuery, ' AND event_end_date <= \'', P_event_end_date,'\'');
END IF;
PREPARE stmt FROM @mainQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
当它执行时
call ssgg.SearchEvents(1, '', NULL, NULL);
它应该返回与团队1相关的所有事件。但是,返回以下错误Error Code: 1525. Incorrect DATE value: ''
我尝试使用实际日期来调用它
call ssgg.SearchEvents(1, '', '2023-01-01', '2023-12-31');
,它应该获得去年的事件,但得到了相同的结果。有什么建议吗?
对于像
P_event_start_date
和 P_event_end_date
这样的 DATE 类型参数,检查空字符串 ('') 是没有意义的,因为它不是 MySQL 中日期的有效表示形式。因此,仅检查日期参数的 NULL
更为合适。
CREATE PROCEDURE `SearchEvents`(IN P_team_id INT, IN P_event_name VARCHAR(255), IN P_event_start_date DATE, IN P_event_end_date DATE)
BEGIN
DECLARE mainQuery VARCHAR(1000);
SET @mainQuery = 'SELECT * FROM events WHERE 1';
IF P_team_id IS NOT NULL AND P_team_id <> '' THEN
SET @mainQuery = CONCAT(@mainQuery, ' AND team_id = ', P_team_id);
END IF;
IF P_event_name IS NOT NULL AND P_event_name <> '' THEN
SET @mainQuery = CONCAT(@mainQuery, ' AND (event_name_en LIKE "%', P_event_name, '%" OR event_name_ar LIKE "%', P_event_name, '%")');
END IF;
IF P_event_start_date IS NOT NULL THEN
SET @mainQuery = CONCAT(@mainQuery, ' AND event_start_date >= \'', P_event_start_date,'\'');
END IF;
IF P_event_end_date IS NOT NULL THEN
SET @mainQuery = CONCAT(@mainQuery, ' AND event_end_date <= \'', P_event_end_date,'\'');
END IF;
PREPARE stmt FROM @mainQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END