2013-11-15 3 views
1

나는 내 datediff 진술에 오류가 있습니다. 코멘트 없음 & '아무 것도 클릭하지 마십시오'비트 잘 작동합니다. 날짜 변수의 형식과 관련이 있다고 생각합니다. int 데이터 형식 '아무것도 클릭하지'는 VARCHAR 값을 변환 할 때SQL Server, DATEDIFF 오류, 날짜 필드 서식 지정 중

오류 메시지가 ..

메시지 245, 수준 16, 상태 1, 줄 2

변환에 실패했습니다.

select 

case 
when stVs.DateLastAction is null then 'Nothing clicked' 
else DATEDIFF(MI,StVs.DateSessionStarted,stVs.DateLastAction) 
end as test 

From Stats_VisitorSessions StVs 
+1

[ 'MI'와 같은 게으른 속기를 사용하지 마십시오. 'MINUTE'을 철자하면 어렵지 않습니다. "(http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad -hots-to-kick-using-in-date-time-operations.aspx). –

답변

5

시도해보십시오 test 결과 집합 열은 숫자 나 문자열 인 경우

select 
case 
when stVs.DateLastAction is null then 'Nothing clicked' 
else CONVERT(varchar(30),DATEDIFF(MI,StVs.DateSessionStarted,stVs.DateLastAction)) 
-- ^^^^^^^^^^^^^^^^^^^^              ^
end as test 

From Stats_VisitorSessions StVs 

TSQL은 힘든 시간을 해결하는 데있다.

CASE 표현식은 하나의 데이터 유형 만 반환 할 수 있습니다. 숫자 및 문자열 데이터 형식을 반환 할 수 없습니다. OP의 경우 숫자 데이터 형식을 결정한 다음 더 많은 행을 처리하고 문자열이어야 함을 확인합니다. Data type precedence을 참조하십시오.

+0

모두 감사합니다 – Mike

+0

'CASE 표현식은 오직 하나의 데이터 유형 만 반환 할 수 있습니다.'글쎄, 당신은 특정 유형으로 그것을 할 수 있습니다 - 반환 된 유형은 동일 할 필요는 없으며, 단지 호환 가능하고 암시 적 변환에 적합해야합니다. 주문도 중요합니다. 예 : '사례 1 '>'1 '도움'ELSE GETDATE() END;'대'사례 선택 1 <> 1 그 다음에 GETDATE() ELSE '도움말'END; –

3

여기서 문제는 CASE 표현의 다른 데이터 유형입니다. CAST을 추가하고 모든 작업을해야합니다 :

select 

case 
when stVs.DateLastAction is null then 'Nothing clicked' 
else CAST(DATEDIFF(MI,StVs.DateSessionStarted,stVs.DateLastAction) AS varchar) 
end as test 

From Stats_VisitorSessions StVs 

또 다른 옵션 대신 메시지의 NULL를 반환하고, 응용 프로그램이 해당 사건을 처리하도록하는 것입니다.