2016-10-17 2 views
1

내 테이블에 Cycle과 Idle이라는 두 개의 필드가 있으며 둘 다 nvarchar (50)이며 둘 다 시간을 포함합니다. TSQL을 사용하여 특정 프로그램 번호를 기반으로 각 필드의 합계를 얻으려고합니다. 다음은 데이터의 작은 예입니다. 캐스트는 다른 필드가 아닌 하나의 필드에서만 작동합니다.

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 

그래서 예를 들어, 그것은 잘 작동

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 

이 내 쿼리입니다 전체 사이클 시간과 유휴 시간 ProgramNo 3998_BOTH_OPPS.MPF 및 9491_OPP1.MPF

을 ... 수 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 서버

여기에 하나의 단순한 방법이다.

+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 자 ... A #이 없다 그래서 만약. 시간이 지나도 작동 할 것입니다.

select right('3.18:15:05',8) 
select right('18:15:05',8) 
관련 문제