2016-08-03 38 views
1

我有1表:SQL轉換爲十進制,然後舍入到最接近半數

表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 @ 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數據類型。這意味着案件陳述有問題。 我期待以下結果 -

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 
+0

'round(value * 2)/ 2'? – jarlh

+0

round(@Time * 2,0)/ 2) - 應該讓我到最近的一半:從這篇文章 - http://stackoverflow.com/questions/9873990/round-to-5-or-1-0- in-sql –

+0

您需要將修改後的數據真正存入您的TIME(或更好的另一個變量)中,然後應用您向我們顯示的第一個邏輯(SET Number =(CASE Time等),使用該值顯示您選擇的內容一個轉換後的值,但從來沒有通過任何東西運行 – Cato

回答

2

您的方法看起來非常複雜。爲什麼不寫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); 
+0

我需要先將varchar時間轉換爲小數,否則@Time不會' t去case case。這是我遇到的麻煩,轉換成十進制和舍入到最接近的一半。 –

+0

+1,現在唯一剩下的就是讓@ Time2四捨五入到最接近的.5。下面是通常做的兩個公式,我如何將它與ROUND結合?選項1:ROUND(TIME/.5,0)* .5 選項2:ROUND(TIME * 2,0)/ 2 –

+0

@AlkippeNikephoros。 。 。我認爲這些選擇都可以。 –

相關問題