2016-10-17 6 views
1

私のテーブルにはサイクルとアイドルの2つのフィールドがあり、どちらもnvarchar(50)です。 TSQLを使用して特定のプログラム番号に基づいて各フィールドの合計を取得しようとしています。以下はデータの小さな例です。キャストは1つのフィールドで動作しますが、他のフィールドでは動作しません。

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]' 

try_convert()と、これは非常に簡単になり2012+

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の

は、ここに1つの単純な方法です。

+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) 
関連する問題