我有一个存储过程,理论上应该返回过去几个月,但它返回无效。
DROP PROCEDURE `open_month` ;
CREATE DEFINER = `root`@`localhost` PROCEDURE `open_month` ( IN `data` VARCHAR( 7 ) ) NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY INVOKER
BEGIN
DECLARE DATAv VARCHAR( 10 ) DEFAULT "";
SET DATAv = CONCAT( data, '-01' ) ;
SELECT *
FROM incom
WHERE MONTH( DATA ) = MONTH( DATAv - INTERVAL 1
MONTH ) ;
END
我快24小时醒来,无法猜出问题。但我可以建议在phpmyadmin的查询监视器中,如果将DATAv设置为用户var(@),该查询将起作用。 谢谢你!
答案 0 :(得分:1)
选项1 : 当参数名称与列名 不匹配时。
您的data
参数似乎采用Y-m
格式,数据类型为varchar
。
因此,在调用
时,您无法获得有效输出,只能获得NULL
month( data )
您需要将data
转换为有效的date
格式并找到其month
。
示例:
SELECT * FROM incom
WHERE MONTH( str_to_date( DATA, '%Y-%m' ) ) = MONTH( DATAv - INTERVAL 1 MONTH ) ;
选项2 : 当参数名称与列名匹配时 :
如果您的表中包含名称为data
的字段,那么除非您在data
列上使用表限定符,否则您的过程将无效。这是因为要使用的列和参数名称不明确。 Observations show that, priority will be given to parameter name,当出现这种模棱两可的时候。您最好稍微更改参数的名称并在代码中使用。或使用表别名来限定列。
修改程序:
DROP PROCEDURE if exists `open_month` ;
delimiter //
CREATE DEFINER = `root`@`localhost`
PROCEDURE `open_month` ( IN `data` VARCHAR( 7 ) )
NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY INVOKER
BEGIN
DECLARE DATAv VARCHAR( 10 ) DEFAULT "";
SET DATAv = CONCAT( data, '-01' ) ;
SELECT *
FROM incom i
WHERE MONTH( i.DATA ) = MONTH( DATAv - INTERVAL 1 MONTH ) ;
END;
//
delimiter ;
通过这些更改,您的程序应该正常运行。