将十进制增加到某个小数,然后使用SQL中的下一个整数

时间:2015-04-23 16:12:25

标签: sql sql-server tsql

我需要转换一个十进制值并将.1添加到它。我的问题是,如果这个价值成为' .5'价值,它需要向上舍入到下一个整数。

例如:如果我的值为' 3.1'这将成为' 3.2' 如果我的值为' 5.3'这将成为5.4' 如果我的值为&#;; 6.4'这将成为' 7.0'

我目前使用案例陈述这样做,所以如果' .X' part是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

谢谢!

4 个答案:

答案 0 :(得分:2)

如果它是小数,那么你应该使用为小数制作的函数,并且尽可能不转换为字符串。以下是模数的使用方法。

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

结果:

nums                                    new_num
--------------------------------------- ---------------------------------------
3.1                                     3.2
5.3                                     5.4
6.4                                     7.0

答案 1 :(得分:1)

假设负值不是问题:

<script> 
    $(document).ready(function(){

    $('ul.tabs li').click(function(){
        var tab_id = $(this).attr('data-tab');

        $('ul.tabs li').removeClass('current');
        $('.tab-content').removeClass('current');

        $(this).addClass('current');
        $("#"+tab_id).addClass('current');
    })

})
</script>

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

答案 2 :(得分:0)

您可以使用floor(x)获取整数部分(左侧),使用(x%1)获取小数部分。然后你可以将两者加在一起(如果是小数部分&lt; .4)或者将1加到整数部分(如果小数部分&gt; = .4):

select FLOOR(@Example) + (case when @Example % 1 >= .4 then 1 else @Example % 1 end)

答案 3 :(得分:0)

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

在没有CASE阻止的情况下进行此操作并非不可能。我怀疑这也不是最短的表达。

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表达式之前,这些小技巧更有用。我认为这些选项确实不具备任何效率优势。