我在 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,但是有没有办法让我调试它以尝试找出可能发生的情况?

有帮助吗?

解决方案

我的第一个猜测是您提供的日期格式是 MySQL 无法识别的。MySQL 对日期文字的格式非常挑剔。它需要 YYYY-MM-DD、YY-MM-DD、YYYYMMDD 或 YYMMDD(您也可以使用任何其他标点字符代替破折号)。看 DATETIME、DATE 和 TIMESTAMP 类型 更多细节。

您还可以使用以下命令将更多日期格式转换为 MySQL 接受的格式 STR_TO_DATE() 功能。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top