在 MySQL 中创建 SP 时收到“错误代码:1525。不正确的 DATE 值:''”

问题描述 投票:0回答:1

我在 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');
,它应该获得去年的事件,但得到了相同的结果。有什么建议吗?

sql mysql stored-procedures
1个回答
0
投票

对于像

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

看到这个数据库<>小提琴。

© www.soinside.com 2019 - 2024. All rights reserved.