首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >上个月get的Mysql过程

上个月get的Mysql过程
EN

Stack Overflow用户
提问于 2014-05-26 09:35:54
回答 2查看 557关注 0票数 0

我有一个存储过程,理论上应该返回透水月,但它返回的是无效的。

代码语言:javascript
复制
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 (@),则该查询可以工作。先谢了!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-26 10:11:06

选项1:当参数名称与列名不匹配时,

您的data参数似乎是Y-m格式的,数据类型是varchar

因此,您只能获得一个NULL的有效输出,如果调用如下所示

代码语言:javascript
复制
month( data )

您需要将data转换为有效的date格式并找到其month

示例:

代码语言:javascript
复制
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,当这种模棱两可的出现。您最好稍微更改一下参数的名称,并在代码中使用。或使用表别名对列进行限定。

修改过程:

代码语言:javascript
复制
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 ;

有了这样的改变,您的程序就会正常工作。

票数 1
EN

Stack Overflow用户

发布于 2022-11-09 04:43:11

下面的查询给出了上个月

代码语言:javascript
复制
select month(now()- INTERVAL 1 month)

用需要的时间替换现在(),以获得前一个月的相应时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23867109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档