【问题标题】:SQL Converting to Decimal then Round to Nearest Half NumberSQL 转换为十进制然后四舍五入到最接近的半数
【发布时间】:2016-08-03 10:36:59
【问题描述】:

我有 1 张桌子:

表 1:

CREATE TABLE #TempTable (Time decimal(10,6), ID int)
INSERT INTO #TempTable (Time, ID) VALUES (0.5,1), (1,2),(2,3),(3,4),(4,5),(5,6),(6,7),(7,8),(8,9),(9,0.10),(10,11)

这给了我:

    select * from #TempTable

+---------+----+
| Time    | ID |
+---------+----+
|0.500000 | 1  |
|1.000000 | 2  |
|2.000000 | 3  |
|3.000000 | 4  |
|4.000000 | 5  |
|5.000000 | 6  |
|6.000000 | 7  |
|7.000000 | 8  |
|8.000000 | 9  |
|9.000000 |10  |
|10.000000|11  |
+---------+----+

我想获得@Number,它基于时间@Time(Col1 中的值)。为此,我正在执行以下操作:

    SET @Number = (CASE @Time
                        WHEN 00.50 THEN 0.016000
                        WHEN 01.00 THEN 0.013300
                        WHEN 01.50 THEN 0.012650
                        WHEN 02.00 THEN 0.012000
                        WHEN 02.50 THEN 0.011200
                        WHEN 03.00 THEN 0.010400
                        WHEN 03.50 THEN 0.010150
                        WHEN 04.00 THEN 0.009900
                        WHEN 04.50 THEN 0.009700
                        WHEN 05.00 THEN 0.009500
                        WHEN 05.50 THEN 0.009450
                        WHEN 06.00 THEN 0.009400
                        WHEN 06.50 THEN 0.009300
                        WHEN 07.00 THEN 0.009200
                        WHEN 07.50 THEN 0.009200
                        WHEN 08.00 THEN 0.009200
                        WHEN 08.50 THEN 0.009100
                        WHEN 09.00 THEN 0.009000
                        WHEN 09.50 THEN 0.009000
                        WHEN 10.00 THEN 0.009000
                        ELSE 9.999999
                    END); 

问题是@Time 是用户输入数据(强制以以下格式输入 hh.hh [00.50 = 30 分钟],输入值时默认为 varchar)。为了确保@Number 永远不会 = 9.999999,除非它 > 10.00,我正在尝试执行以下逻辑:

 IF @Time > 00.00 AND @Time <= 10.00 THEN round to .5 and convert to decimal(10,2)
 ELSE convert to decimal(10,6)


    SELECT  convert(decimal(10,6),@TimeA), 
CASE
  WHEN convert(decimal(10,6), @TimeA) >= 0.0 AND convert(decimal(10,6), @TimeA) <= 10.0 THEN convert(decimal(10,2),round(@TimeA * 2,0)/2)
  ELSE convert(decimal(10,6),round(@TimeA * 2,0)/2)
END
    FROM azteca.Table 1 WHERE ID = @ID

SET @Time = @TimeA

上面给了我:nvarchar 04.50 无法转换为 int 数据类型。这意味着 case 语句有问题。 我希望得到以下结果 -

User Input: 00.50 @Number = 0.016000
User Input: 01.50 @Number = 0.012650
User Input: 05.78 @Number = 0.009400
User Input: 07.90 @Number = 0.009200
User Input: 09.12 @Number = 0.009000

【问题讨论】:

  • round(value*2)/2?
  • round(@Time * 2,0)/2) - 应该让我到最近的一半:来自这篇文章 - stackoverflow.com/questions/9873990/round-to-5-or-1-0-in-sql
  • 您需要将修改后的数据实际放入您的 TIME(或更好的另一个变量)中,然后使用您展示的值应用您向我们展示的第一个逻辑(SET Number =(CASE Time 等)我们,您选择了一个转换后的值,但从未运行过任何东西
  • 我不确定发生了什么,但我相信你很接近,但我不确定你的不同代码部分是如何连接起来的。
  • 你对安德鲁,我添加了变量。基本上,我的 case 语句有一些语法错误,它无法转换和舍入(其中包含 convert 的情况)。

标签: sql sql-server type-conversion rounding


【解决方案1】:

您的方法似乎很复杂。为什么不直接用不等式写CASE

DECLARE @Time2 DECIMAL(10, 6);
SET @Time2 = CAST(@Time AS DECIMAL(10, 6));

SET @Number = (CASE WHEN @Time2 <= 00.50 THEN 0.016000
                    WHEN @Time2 <= 01.00 THEN 0.013300
                    WHEN @Time2 <= 01.50 THEN 0.012650
                    . . .
               END);

【讨论】:

  • 我需要先将varchar时间转换为小数,否则@Time不会进入case语句。这就是我遇到的麻烦,转换为十进制并四舍五入到最接近的半数。
  • +1 ,现在唯一剩下的就是将 @Time2 四舍五入到最接近的 0.5。以下是两个正常执行的公式,如何将它与 ROUND 结合使用?选项 1:ROUND(TIME / .5,0) * .5 选项 2:ROUND(TIME * 2,0) / 2
  • @AlkippeNikephoros 。 . .我认为这两个选项中的任何一个都可以。
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多