我有一个存储过程,理论上应该返回透水月,但它返回的是无效的。
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 (@),则该查询可以工作。先谢了!
发布于 2014-05-26 10:11:06
选项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 ;有了这样的改变,您的程序就会正常工作。
发布于 2022-11-09 04:43:11
下面的查询给出了上个月
select month(now()- INTERVAL 1 month)用需要的时间替换现在(),以获得前一个月的相应时间。
https://stackoverflow.com/questions/23867109
复制相似问题