来自TSQL""之间的意外结果声明

时间:2015-04-08 02:02:13

标签: sql sql-server tsql

我刚刚在"之间进行了实验。在TSQL中的语句,以下代码返回" 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

如果我将@Value更改为20.5,结果为" false",但20.4返回" true"。似乎TSQL正在使用"银行家的四舍五入"小数值。

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

2 个答案:

答案 0 :(得分: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 -> 2121.5 -> 22。随着银行家的四舍五入,20.5将四舍五入为20。

答案 1 :(得分:4)

我弄清楚我做错了什么。我忘了指定十进制变量中的小数点数。例如,以下代码返回" false"应该:

declare @Value as decimal(18,2)
declare @Upper as decimal(18,2)
declare @Lower as decimal(18,2)

set @Value = 20.1
set @Lower = 10
set @Upper = 20

select 
    case
        when @Value between @Lower and @Upper then 'true'
        else 'false'
    end as Result

基本上,我的原始查询是使用整数而不是浮点值。