存储过程将int转换为十进制

时间:2018-02-21 20:18:48

标签: mysql stored-procedures return-value

我正在编写一个存储过程来返回一些统计信息。我有两个不同的表,一个是在系统投入使用后收集的统计数据,另一个是自

以来的统计数据

我的程序如下:

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,因此任何关于为什么会发生这种情况的提示,以及如何解决这个问题都会很多赞赏。

1 个答案:

答案 0 :(得分:2)

我发现在存储过程中强制选择类型的最佳方法是将INSERT ... SELECT转换为临时表(在proc中创建所需类型),然后从中选择那。您可以尝试CAST(x AS SIGNED),但是您无法控制BIGINT,INT等。

编辑:CAST在存储过程/查询中通常很好;但是当你需要更多定义的类型来与API调用交互时,例如GetInt32(fieldnum),临时表方法可能会非常有用。