Mysql程序获取上个月

时间:2014-05-26 09:35:55

标签: mysql stored-procedures phpmyadmin

我有一个存储过程,理论上应该返回过去几个月,但它返回无效。

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(@),该查询将起作用。 谢谢你!

1 个答案:

答案 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 ;

通过这些更改,您的程序应该正常运行。