将十进制数递增到某个十进制数,然后在SQL中使用下一个整数

将十进制数递增到某个十进制数,然后在SQL中使用下一个整数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要转换一个十进制值并加上.1。我的问题是,如果该值将成为“.5”值,则需要将其四舍五入到下一个整数 例如:如果我的值为“3.1”,则会变成“3.2” 如果我的值为“5.3”,则会变成“5.4” 如果我的值为“6.4”,则会变成“7.0” 我目前使用case语句来实现这一点,因此,如果“.X”部分为4,它将添加0.6,否则它将添加1,但是否有更有效/更好的方法来实现这一点 当前代码的示例: declare @Example Decimal (5,1) = '4.4' select case

我需要转换一个十进制值并加上.1。我的问题是,如果该值将成为“.5”值,则需要将其四舍五入到下一个整数

例如:如果我的值为“3.1”,则会变成“3.2” 如果我的值为“5.3”,则会变成“5.4” 如果我的值为“6.4”,则会变成“7.0”

我目前使用case语句来实现这一点,因此,如果“.X”部分为4,它将添加0.6,否则它将添加1,但是否有更有效/更好的方法来实现这一点

当前代码的示例:

declare @Example Decimal (5,1) = '4.4'

select case when @Example like '%.4' then (@Example + '0.6')
else @Example + '0.1' end

谢谢

如果是小数,则应使用为小数而设计的函数,尽可能不要转换为字符串。下面是如何使用模数进行计算

DECLARE @Table TABLE (nums DECIMAL(5,1))
INSERT INTO @Table
VALUES  (3.1),(5.3),(6.4)

SELECT  nums,
        CASE 
            WHEN nums % 1 < .4 THEN nums + .1
            ELSE CEILING(nums)
        END AS new_num
FROM @Table

如果它是一个十进制数,那么您应该使用针对十进制数的函数,并且尽可能不要转换为字符串。下面是如何使用模数进行计算

DECLARE @Table TABLE (nums DECIMAL(5,1))
INSERT INTO @Table
VALUES  (3.1),(5.3),(6.4)

SELECT  nums,
        CASE 
            WHEN nums % 1 < .4 THEN nums + .1
            ELSE CEILING(nums)
        END AS new_num
FROM @Table

如果它是一个十进制数,那么您应该使用针对十进制数的函数,并且尽可能不要转换为字符串。下面是如何使用模数进行计算

DECLARE @Table TABLE (nums DECIMAL(5,1))
INSERT INTO @Table
VALUES  (3.1),(5.3),(6.4)

SELECT  nums,
        CASE 
            WHEN nums % 1 < .4 THEN nums + .1
            ELSE CEILING(nums)
        END AS new_num
FROM @Table

如果它是一个十进制数,那么您应该使用针对十进制数的函数,并且尽可能不要转换为字符串。下面是如何使用模数进行计算

DECLARE @Table TABLE (nums DECIMAL(5,1))
INSERT INTO @Table
VALUES  (3.1),(5.3),(6.4)

SELECT  nums,
        CASE 
            WHEN nums % 1 < .4 THEN nums + .1
            ELSE CEILING(nums)
        END AS new_num
FROM @Table

可以使用floor(x)获取整数部分(左侧),使用(x%1)获取小数部分。然后,您可以将两者相加(如果小数部分<.4)或将1加到整数部分(如果小数部分>0.4):


可以使用floor(x)获取整数部分(左侧),使用(x%1)获取小数部分。然后,您可以将两者相加(如果小数部分<.4)或将1加到整数部分(如果小数部分>0.4):


可以使用floor(x)获取整数部分(左侧),使用(x%1)获取小数部分。然后,您可以将两者相加(如果小数部分<.4)或将1加到整数部分(如果小数部分>0.4):


可以使用floor(x)获取整数部分(左侧),使用(x%1)获取小数部分。然后,您可以将两者相加(如果小数部分<.4)或将1加到整数部分(如果小数部分>0.4):


假设负值不是问题:

declare @Samples as Table ( Sample Decimal(5,1) );
insert into @Samples
  values ( 0.0 ), ( 1.2 ), ( 2.4 ), ( 3.5 ), ( 4.6 ), ( 42.0 ), ( -1.2 ), ( -2.4 );
select Sample, Sample + 0.6 - 0.5 * Sign( Abs( Sample % 1.0 - 0.4 ) ) as [Result]
  from @Samples;

不是说这是一个好主意,但它完成了工作。

假设负值不是问题:

declare @Samples as Table ( Sample Decimal(5,1) );
insert into @Samples
  values ( 0.0 ), ( 1.2 ), ( 2.4 ), ( 3.5 ), ( 4.6 ), ( 42.0 ), ( -1.2 ), ( -2.4 );
select Sample, Sample + 0.6 - 0.5 * Sign( Abs( Sample % 1.0 - 0.4 ) ) as [Result]
  from @Samples;

不是说这是一个好主意,但它完成了工作。

假设负值不是问题:

declare @Samples as Table ( Sample Decimal(5,1) );
insert into @Samples
  values ( 0.0 ), ( 1.2 ), ( 2.4 ), ( 3.5 ), ( 4.6 ), ( 42.0 ), ( -1.2 ), ( -2.4 );
select Sample, Sample + 0.6 - 0.5 * Sign( Abs( Sample % 1.0 - 0.4 ) ) as [Result]
  from @Samples;

不是说这是一个好主意,但它完成了工作。

假设负值不是问题:

declare @Samples as Table ( Sample Decimal(5,1) );
insert into @Samples
  values ( 0.0 ), ( 1.2 ), ( 2.4 ), ( 3.5 ), ( 4.6 ), ( 42.0 ), ( -1.2 ), ( -2.4 );
select Sample, Sample + 0.6 - 0.5 * Sign( Abs( Sample % 1.0 - 0.4 ) ) as [Result]
  from @Samples;

不是说这是一个好主意,但它完成了工作。

注意:我不确定所有的回答者都按照您的预期方式处理分数值。我的版本将0.4视为四舍五入的截止值。分数分量在0.4和0.9之间的所有值都以相同的方式处理

不使用
案例
块也不是不可能的。我怀疑这也不是最短的表达

declare @t as table (d decimal(5, 1) not null);
insert into @t
values (2.0), (2.1), (2.2), (2.3), (2.4), (2.5), (2.6), (2.7), (2.8), (2.9);

select d, d + 0.1 + (round(-0.8 + d % 1, 0) + 1) * (0.9 - d % 1)
from @t;
我假设这些数字是正数,因为你没有具体说明关于负数的行为

至于舍入的另一种方法:这在代数上等同于另一个答案,但这种方法的逻辑可能更为明显

d + 0.1 + 0.5 * (1 - abs(sign(d % 1 - 0.4)))
下面是另一个基于函数的表达式。当然,
coalesce
确实在内部扩展为一个
case
表达式

floor(d) + 0.1 + coalesce(nullif(d % 1, 0.4), 0.9)
您的方法的问题在于隐式强制转换。在这些类型转换中,你假设点字符总是小数点

编辑:

如果你确定输入的分数部分永远不会超过0.4,那么我可以想出另一个简单的计算方法

d + 0.1 + floor(d % 1 * 2.5) * 0.5

在SQL平台出现
case
表达式之前,这些小技巧更有用。我认为这些选项不太可能真的有任何效率方面的好处。

注意:我不确定所有的回答者是否都按照您的预期方式处理分数值。我的版本将0.4视为四舍五入的截止值。分数分量在0.4和0.9之间的所有值都以相同的方式处理

不使用
案例
块也不是不可能的。我怀疑这也不是最短的表达

declare @t as table (d decimal(5, 1) not null);
insert into @t
values (2.0), (2.1), (2.2), (2.3), (2.4), (2.5), (2.6), (2.7), (2.8), (2.9);

select d, d + 0.1 + (round(-0.8 + d % 1, 0) + 1) * (0.9 - d % 1)
from @t;
我假设这些数字是正数,因为你没有具体说明关于负数的行为

至于舍入的另一种方法:这在代数上等同于另一个答案,但这种方法的逻辑可能更为明显

d + 0.1 + 0.5 * (1 - abs(sign(d % 1 - 0.4)))
下面是另一个基于函数的表达式。当然,
coalesce
确实在内部扩展为一个
case
表达式

floor(d) + 0.1 + coalesce(nullif(d % 1, 0.4), 0.9)
您的方法的问题在于隐式强制转换。在这些类型转换中,你假设点字符总是小数点

编辑:

如果你确定输入的分数部分永远不会超过0.4,那么我可以想出另一个简单的计算方法

d + 0.1 + floor(d % 1 * 2.5) * 0.5

在SQL平台出现
case
表达式之前,这些小技巧更有用。我认为这些选项不太可能真的有任何效率方面的好处。

注意:我不确定所有的回答者是否都按照您的预期方式处理分数值。我的版本将0.4视为四舍五入的截止值。分数分量在0.4和0.9之间的所有值都以相同的方式处理

不使用
案例
块也不是不可能的。我怀疑这也不是最短的表达

declare @t as table (d decimal(5, 1) not null);
insert into @t
values (2.0), (2.1), (2.2), (2.3), (2.4), (2.5), (2.6), (2.7), (2.8), (2.9);

select d, d + 0.1 + (round(-0.8 + d % 1, 0) + 1) * (0.9 - d % 1)
from @t;
我假设这些数字是正数,因为你没有具体说明关于负数的行为

至于舍入的另一种方法:这在代数上等同于另一个答案,但这种方法的逻辑可能更为明显

d + 0.1 + 0.5 * (1 - abs(sign(d % 1 - 0.4)))
下面是另一个基于函数的表达式。当然,
coalesce
确实在内部扩展为一个
case
表达式

floor(d) + 0.1 + coalesce(nullif(d % 1, 0.4), 0.9)
您的方法的问题在于隐式强制转换。在这些类型转换中,你假设点字符总是小数点

编辑:

<