我正在编写一个存储过程来返回一些统计信息。我有两个不同的表,一个是在系统投入使用后收集的统计数据,另一个是自
以来的统计数据我的程序如下:
CREATE PROCEDURE getStats(IN uID INT, IN since_date DateTime)
BEGIN
DECLARE rowcount int;
select klubid from core_medlemmer where id = uID into @klubid;
select create_date from core_klub where id = @klubid into @create_date;
if since_date < @create_date then
-- select from historic and current
select sum(attendance) from core_historic_modestatistik where medlemsid = uID into @historic_total;
SELECT @historic_total + count(*) as total_attendance from core_fremmode where medlemsid= uID and dato >= since_date;
else
-- select only current
SELECT count(*) as total_attendance from core_fremmode where medlemsid= uID and dato >= since_date;
end if;
END //
DELIMITER ;
使用select sum(attendance) from core_historic_modestatistik where medlemsid = uID
执行此存储过程看起来是正确的:
+-----------------+
| sum(attendance) |
+-----------------+
| 655 |
+-----------------+
但似乎添加将其转换为真实的:
+------------------------------------+
| total_attendance |
+------------------------------------+
| 656.000000000000000000000000000000 |
+------------------------------------+
我正在求和的列是一个int,而count()
函数应该只能返回INT
s,因此任何关于为什么会发生这种情况的提示,以及如何解决这个问题都会很多赞赏。
答案 0 :(得分:2)
我发现在存储过程中强制选择类型的最佳方法是将INSERT ... SELECT转换为临时表(在proc中创建所需类型),然后从中选择那。您可以尝试CAST(x AS SIGNED)
,但是您无法控制BIGINT,INT等。
编辑:CAST在存储过程/查询中通常很好;但是当你需要更多定义的类型来与API调用交互时,例如GetInt32(fieldnum)
,临时表方法可能会非常有用。