我在数据库服务器中有一个存储过程,当该记录不存在时返回值5064803
,并且根据构建变量值的查询值应为5064800
我不确定这是FLOAT
数据类型的值是一个问题,并且表的记录中的值以双零结尾或者什么但我无法轻易弄清楚
表数据类型与来自设置的传感器的数据类型相匹配,但此传感器的这个特定值实际上从未实际设置为数据类型,并且它通常始终是1-8位INT
,没有小数但我为了以防万一,我希望保持数据类型与相关传感器相同。
我已经分解了proc并且我能够轻松地重新创建问题所以我将在下面发布详细信息,以便能够帮助我找出问题和任何解决方法等。
创建表格
delimiter $$
CREATE TABLE `number` (
`TimeInt` varchar(10) NOT NULL,
`TimeStr` datetime NOT NULL,
`IsInitValue` int(11) NOT NULL,
`Value` float NOT NULL,
`IQuality` int(11) NOT NULL,
UNIQUE KEY `uk_Times` (`TimeInt`,`TimeStr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
插入数据
INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502618950','2017-08-13 10:09:10',1,5064800,0);
INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502618796','2017-08-13 10:06:36',0,5064800,3);
INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502617167','2017-08-13 09:39:27',1,5063310,0);
INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502613355','2017-08-13 08:35:55',0,5063310,3);
INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502612814','2017-08-13 08:26:54',1,0,0);
INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502609015','2017-08-13 07:23:35',0,0,3);
SQL查询细分
SET @bStartTime = '2017-08-13 09:24:16';
SET @bEndTime = '2017-08-13 10:06:31';
SET @LastNumber = (SELECT Value FROM Number ORDER BY TimeStr DESC LIMIT 1);
SET @NowNumber = (SELECT Value FROM Number WHERE TimeStr BETWEEN @bStartTime AND @bEndTime ORDER BY TimeStr DESC LIMIT 1);
SELECT @NowNumber;
SELECT @LastNumber;
所以基于上面的 SQL查询细分,一旦所有数据都在表中,然后我在SELECT
内的@NowNumber
查询中运行查询/或@LastNumber
变量,我得到5064800
的正确结果。但是,如果我为这两个语句运行整个SET
语句以使其设置查询,然后只执行这些变量的SELECT
,则会返回5064803
的错误结果。
因此,例如,如果我运行SELECT Value FROM Number ORDER BY TimeStr DESC LIMIT 1
,则返回正确的值。如果我运行SET @LastNumber = (SELECT Value FROM Number ORDER BY TimeStr DESC LIMIT 1);
然后运行SELECT @LastNumber;
,则会返回错误的值。
这个特别 MySQL服务器在 Windows Server 2008 上运行x86版本的5.5.50
,内存为144 GB,用于某些快速规范。
我想知道造成这种情况的原因,以及是否有问题的解决方法,无论是否更改列的数据类型,假设当它作为变量而不是仅仅返回时出现问题一个直接的查询结果。
答案 0 :(得分:1)
抱歉,声明只能在MySQL的存储过程中使用。我发现这篇文章可能有所帮助。它解释了MySQL在存储数字时如何舍入并建议使用双精度数。尝试将浮动更改为双打。
MySql FLOAT datatype and problems with more then 7 digit scale