来自TSQL"之间"语句的意外结果

Bil*_*ous 1 sql t-sql sql-server

我刚刚在TSQL中尝试了"between"语句,下面的代码返回"true":

declare @Value as decimal
declare @Upper as decimal
declare @Lower as decimal

set @Value = 20.1
set @Lower = 10.0
set @Upper = 20.0

select 
    case
    when @Value between @Lower and @Upper then 'true'
        else 'false'
    end as Result
Run Code Online (Sandbox Code Playgroud)

如果我将@Value更改为20.5,结果为"false",但20.4返回"true".似乎TSQL使用"银行家舍入"来表示十进制值.

如果我将变量更改为"money",我会得到预期的结果,即@Value = 20.1返回"false".

And*_*rew 5

只是为了澄清发生了什么,如果你只是打印你的变量,你会发现它们的值分别是20,10和20.

decimal默认的精度和比例是18和0,所以decimal= decimal(18,0).这就是你在那里丢失小数的原因.你没有这个问题,money因为它具有4位小数的精度.

资料来源:https://msdn.microsoft.com/en-us/library/ms187746.aspx

SQL没有使用银行家的舍入..5总是向上取整:20.5 -> 21,21.5 -> 22.随着银行家的四舍五入,20.5将四舍五入到20.

  • 你是对的,我应该输出变量,这会使问题变得明显.关于银行家的四舍五入,我不知道这一点 - 有助于了解! (2认同)