2015-12-15 85 views

回答

4

您可以使用左,右和子提取值,然後進行一些計算。

declare @S varchar(8) = '88:52:57'; 

select left(@S, 2) + substring(@S, 4, 2)/60.0 + right(@S, 2)/60.0/60.0; 

如果你不總是有兩個數字值,你可以使用parsename來獲取值。

declare @S varchar(20) = '088:052:057'; 

select parsename(S.X, 3) + parsename(S.X, 2)/60.0 + parsename(S.X, 1)/60.0/60.0 
from (select replace(@S, ':', '.')) as S(X) 
+0

這將做到這一點。但是,如果我得到格式爲'121:32:43'的時間間隔,則會出現問題 – tom

+0

您可能會用'SELECT CHARINDEX(':','88:52:57')替換第一個「2」,然後第二個用'SELECT CHARINDEX(':','88:52:57',CHARINDEX(':','88:52:57')+ 1)'或者像我在我的回答中那樣使用分裂。 – Shnugo

+0

@Shnugo添加了適用於不同長度值部件的版本。 –

1

嘗試像這樣(最好從這個創建UDF):

首先我分裂時變上通過XML的雙點。剩下的就是簡單的計算...

DECLARE @YourTime VARCHAR(100)='88:52:57'; 

WITH Splitted AS 
(
    SELECT CAST('<x>' + REPLACE(@YourTime,':','</x><x>') + '</x>' AS XML) TimeParts 
) 
,TimeFract AS 
(
    SELECT TimeParts.value('/x[1]','float') AS HourPart 
      ,CAST(TimeParts.value('/x[2]','int') * 60 + TimeParts.value('/x[3]','int') AS FLOAT) Seconds 
    FROM Splitted 
) 
SELECT HourPart + Seconds/3600 
FROM TimeFract 

結果

88,8825 
1

試試這個,解決方案是基於轉換,使得它的安全,如果格式總是(H)H:MI:SS :

DECLARE @S varchar(8) = '88:52:57'; 
SELECT 
    CAST(REPLACE(left(@S, 2), ':', '') as int)+ 
    CAST(CAST(CAST('0:'+RIGHT(@S, 5) as datetime) as decimal(10,10)) * 24 as decimal(2,2)) 

結果:

88.88 
相關問題