相同 SQL,Sybase 和 SQL 服务器中的结果不同
Same SQL, different result in Sybase and SQL Server
以下查询 returnSybase 和 SQL 服务器中的不同值。
select CONVERT(numeric(12, 6), round((-0.00193499999999991) / (30) * (9) + 9.742500000000000e-001, 6))
在 Sybase 中它 returns 0.973670 而在 SQL Server 中它 returns 0.973669。你知道为什么以及哪个是正确的结果吗?
将舍入精度从 6 更改为 7 会导致 Sybase 也 return 0.973669 但我不确定为什么这是 required.SQL 服务器也 returns 0.973669,舍入精度为 7
select CONVERT(numeric(12, 6), round((-0.00193499999999991) / (30) * (9) + 9.742500000000000e-001, 7))
谢谢
Resolved :Gordan 下面的回答为我指明了正确的方向。我忘了提一个细节。查询中的文字实际上是作为存储过程中的变量读取的值,然后在我发布的查询中使用。文字值的来源是声明为 numeric(10,6) 的两个数据库字段之间的差异。遗留 SP 有两个声明为 float 的变量,0.972315 和 0.974250 的差值产生 -0.001935,但是在 SQL Server 中它产生 -0.00193499999999991 这作为其浮点数学并不奇怪。所以 Sybase 掩盖了这个问题。将 SP 变量更改为 numeric(12,6) 类型解决了问题,并且 Sybase 和 SQL 服务器中的结果匹配。我将复习其他 SP 代码以使用 float 类型的变量。
根据我对相关文档的阅读(Sybase and SQL Server),这两个数据库处理数字文字的方式不同。
- Sybase 将
-0.00193499999999991
解释为浮点数。
- SQL 服务器将其解释为十进制数。
这可能解释了结果的差异。
至于哪个是正确的。我对各种数据库的算术运算还是很有信心的。我会说两者都是正确的,因为它们遵循解释查询和计算值的规则。
以下查询 returnSybase 和 SQL 服务器中的不同值。
select CONVERT(numeric(12, 6), round((-0.00193499999999991) / (30) * (9) + 9.742500000000000e-001, 6))
在 Sybase 中它 returns 0.973670 而在 SQL Server 中它 returns 0.973669。你知道为什么以及哪个是正确的结果吗?
将舍入精度从 6 更改为 7 会导致 Sybase 也 return 0.973669 但我不确定为什么这是 required.SQL 服务器也 returns 0.973669,舍入精度为 7
select CONVERT(numeric(12, 6), round((-0.00193499999999991) / (30) * (9) + 9.742500000000000e-001, 7))
谢谢
Resolved :Gordan 下面的回答为我指明了正确的方向。我忘了提一个细节。查询中的文字实际上是作为存储过程中的变量读取的值,然后在我发布的查询中使用。文字值的来源是声明为 numeric(10,6) 的两个数据库字段之间的差异。遗留 SP 有两个声明为 float 的变量,0.972315 和 0.974250 的差值产生 -0.001935,但是在 SQL Server 中它产生 -0.00193499999999991 这作为其浮点数学并不奇怪。所以 Sybase 掩盖了这个问题。将 SP 变量更改为 numeric(12,6) 类型解决了问题,并且 Sybase 和 SQL 服务器中的结果匹配。我将复习其他 SP 代码以使用 float 类型的变量。
根据我对相关文档的阅读(Sybase and SQL Server),这两个数据库处理数字文字的方式不同。
- Sybase 将
-0.00193499999999991
解释为浮点数。 - SQL 服务器将其解释为十进制数。
这可能解释了结果的差异。
至于哪个是正确的。我对各种数据库的算术运算还是很有信心的。我会说两者都是正确的,因为它们遵循解释查询和计算值的规则。