SQL 转换为小数然后四舍五入到最接近的半数

SQL Converting to Decimal then Round to Nearest Half Number

我有1个Table:

Table 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

你的方法好像很复杂。为什么不直接使用不等式写 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);