簡體   English   中英

SQL轉換為十進制然后四舍五入為最接近的半數

[英]SQL Converting to Decimal then Round to Nearest Half Number

我有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 minutes]輸入,當他們輸入值時默認為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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM