2016-10-17 58 views
1

我的表中有兩個字段,Cycle和Idle,都是nvarchar(50),都包含時間。我試圖根據使用TSQL的特定程序編號獲得每個字段的總數。以下是數據的一個小例子。Cast在一個字段上工作,但不是其他

Id  ProgramNo   Cycle  Idle 
209702 3998_BOTH_OPPS.MPF 00:02:41 00:00:25 
209703 472_7580_OPP1.MPF 00:02:08 00:01:44 
209704 3998_BOTH_OPPS.MPF 00:00:27 00:00:11 
209705 3998_BOTH_OPPS.MPF 00:00:00 00:00:00 
209706 3998_BOTH_OPPS.MPF 00:00:01 00:01:40 
209707 9491_OPP1.MPF  00:00:00 00:00:00 
209708 9491_OPP1.MPF  00:00:01 00:00:04 
209709 9491_OPP1.MPF  00:01:05 00:00:19 

因此,例如,獲得ProgramNo 3998_BOTH_OPPS.MPF總週期時間和空閒時間和9491_OPP1.MPF

這是我的查詢......

SELECT 
    ProgramNo, 
    cast(dateadd(MILLISECOND, sum(datediff(MILLISECOND, 0, cast(Cycle AS DATETIME))), 0) AS TIME) AS CycleTime, 
    cast(dateadd(MILLISECOND, sum(datediff(MILLISECOND, 0, cast(Idle AS DATETIME))), 0) AS TIME) AS IdleTime 
FROM Cycle 
GROUP BY ProgramNo 

它工作得很好對於CycleTime,但IdleTime發生錯誤:

「轉換日期和/或時間從字符串轉換失敗「。

有什麼建議嗎?先謝謝你。

+1

這意味着你有一些不好的數據在該領域的記錄。一些不能轉換的東西。 – HLGEM

回答

1

您需要查找與HH:MM:SS格式不匹配的值。

這裏有一個簡單的方法:

select idle_time 
from cycle 
where idle_time not like '[0-9][0-9]:[0-9][0-9]:[0-9][0-9]' 

如果還是不行的話,看的組件:

where (idle_time like '[0-9][0-9]:[0-9][0-9]:[0-9][0-9]' and 
     (not (left(idle_time, 2) between '00' and '23') or 
     not substring(idle_time, 4, 2) between '00' and '59') or 
     not right(idle_time, 2) between '00' and '59') 
     ) 

的SQL Server 2012+做這麼多與try_convert()容易。

+0

2.03:02:07 3.18:15:05 3.21:06:53 3.19:40:03 2.09:20:53 – volleygirl029

+0

所以看起來我在小時前有一個數字,後面跟着一個句點。在我有機會查看它之前,我無意中添加了上面的評論。關於如何填補這些領域,有沒有更好的建議?我覺得我已經嘗試了一切。 – volleygirl029

+0

@ volleygirl029。 。 。請用適當的樣本數據(包括帶空格的字段)和期望的結果提出另一個問題。 –

0

基於上述的評論,你可以修復你的數據,像這樣:

cast(dateadd(MILLISECOND, sum(datediff(MILLISECOND, 0, cast(right(Idle,8) AS DATETIME))), 0) AS TIME) as IdleTime 

我們只是希望在最右邊的8個字符...因此,如果沒有一個#。在你的時間之前,它仍然會工作

select right('3.18:15:05',8) 
select right('18:15:05',8) 
相關問題