2009-08-05 16 views
3

我在MySQL存储功能:MySQL中的存储函数不喜欢用户提供的日期?

CREATE FUNCTION `login_count`(o INT, start_date DATE, end_date DATE) RETURNS INT 
READS SQL DATA 
BEGIN 
DECLARE total_count INT; 
SELECT COUNT(*) INTO total_count FROM logins as l WHERE `order_id` = o && modified BETWEEN start_date AND end_date; 
RETURN total_count; 
END 

非常基本的,需要一个ID,开始日期和结束日期,并返回登录该日期范围的计数。每当我运行它时,我都会返回0。除非我删除where子句的日期部分。然后它返回一个实际的数字。或者,如果我只是手动将日期存储在它的存储函数中...所以这不是日期的问题,但只有当我通过参数列表提供日期时,它不喜欢它。

有什么想法会导致这种情况发生?事实上,我可以手动将日期存储在存储的功能,它的工作真的让我感到困扰。这并不像很多事情在这里发生,可能会搞砸,所以我有点失落,因为接下来要尝试什么。

此外,有没有一种方法来调试存储的功能/过程。我只是回到0,但是有没有办法让我调试这个来试图找出可能发生的事情?

回答

2

我的第一个猜测是你提供的日期格式是MySQL无法识别的。 MySQL对日期文字的格式非常挑剔。它需要YYYY-MM-DD,YY-MM-DD,YYYYMMDD或YYMMDD(您也可以使用任何其他标点符号代替破折号)。有关更多详细信息,请参见The DATETIME, DATE, and TIMESTAMP Types

您还可以使用STR_TO_DATE()函数将更多日期格式转换为MySQL接受的格式。

关于调试存储过程和存储函数,您始终可以使用前缀@设置用户定义的变量,并且该变量在存储的函数返回后变为全局可用。就像一个副作用。因此,您可以在运行存储的功能时使用它来设置诊断信息,然后再检查它。

+0

感谢您的提示,我会尽力调试这一点。至于日期这里的东西是我如何打电话给它。 SELECT login_count(3250,'2009-05-31','2009-06-31'); 哪种格式适合,但谁知道发生了什么。我会尝试@的东西,并发布更多信息。 – 2009-08-05 21:56:46

+0

嘿,你的评论让我回去捣鼓日期。我一直在使用YYYY-MM-31一个月的时间,并且它一直工作。但由于某种原因,在这种情况下,它不喜欢六月31日:) – 2009-08-05 22:08:17

+0

嘿!如果我的建议帮助你注意到真正的问题,那么我很高兴。 – 2009-08-05 22:26:54

相关问题