【问题标题】:Mysql Procedure for get previous month获取上个月的Mysql程序
【发布时间】:2014-07-15 01:11:04
【问题描述】:

我有一个存储过程,理论上应该返回前一个月,但它返回 void。

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 (@),则该查询有效。 提前谢谢!

【问题讨论】:

  • 您能否发布data 参数的示例值和预期的上个月值?
  • 你必须声明一个日期来代替 varchar 变量
  • 我的第一个意图是从月份输入中获取“2014-04”,并且在没有 php 帮助的情况下在程序中进行处理。在纯粹的查询中,我得到了这样的方式。我的测试中的一个示例是上面的“2014-04”连接“2014-04-01”以获得月份1“2014-03-1”并获得月份“3”

标签: mysql stored-procedures phpmyadmin


【解决方案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 ;

进行此类更改后,您的程序应该可以正常工作。

【讨论】:

  • 是的!我总是为参数设置'n'前缀,但这次我没有注意到。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多