SQL Server POWER 函数

标签 sql sql-server sql-server-2008-r2 bigint

当我输入以下查询时使用 SQL Server 2008 R2:

SELECT CAST(POWER(2.0, 63.0) AS BIGINT);

这会产生结果:

9223372036854775800

但是,使用 Windows 桌面计算器将 2 加到 63 的结果是:

9223372036854775807

有人可以解释一下其中的区别吗——或者 SQL Server 是否正在进行一些内部转换? ...或者我还缺少其他东西吗?

最佳答案

MS Sql Server 中BIGINT的范围是:

-2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807)

计算器给出的数字是错误的,因为 2^63 最右边的数字不可能是奇数。

SQL Server 中的 POWER 函数 ( http://technet.microsoft.com/en-us/library/ms174276.aspx ) 返回与其第一个参数相同的类型。

编写此查询的正确方法是:

DECLARE @foo REAL = 2.0
SELECT CAST(POWER( @foo, 63.0 ) AS BIGINT)

这样,您将收到 将表达式转换为数据类型 bigint 时出现算术溢出错误。 错误消息。 关于原因 http://www.extremeoptimization.com/resources/Articles/FPDotNetConceptsAndFormats.aspx

关于为什么 POWER 函数返回错误数字的问题?正如 @simonatrcl 在他的回答中提到的, float 存在算术问题,有时会导致无效结果。您可以在此处阅读有关 float 及其问题的信息:

http://www.extremeoptimization.com/resources/Articles/FPDotNetConceptsAndFormats.aspx

您还可以在此处检查 MS Sql Server 中整数类型的边界: http://technet.microsoft.com/en-us/library/ms187745.aspx

关于SQL Server POWER 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20937242/

相关文章:

mysql - 围绕将 2 种不同类型的 ID 与一条信息相关联的 SQL 模式设计问题

SQL + 具有不同行集的内部选择

sql-server - 在 SQL Server 中使用 XML PATH 命令将多个值合并到一个单元格中

参数为空不为空的sql查询

SQL 组合列字符串

sql - 查找在不同入职日期雇用的员工姓名

sql - 基于不同表列的计算列公式

sql-server - TinyTds - Adaptive 服务器不可用或不存在

sql - 填写缺失值

c# - 从 SQL 返回 2 个结果