【发布时间】: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