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);
我有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);