2012-07-05 3 views
4
ProcessTime: 00:00:00.0000012 
RegexResolveTime: 00:00:00.0000421 
MessageResolveTime: 00:00:00.0001269 
FullProcessTime: 00:00:00.0001734 

좋아요, 데이터 유형이 Time(7) 인 위와 같이 4 개의 열이 있습니다. 개별 열의 모든 항목의 평균을 구해야하지만 Time(7)AVG 연산자에 유효한 유형이 아닙니다!평균 TIME (7)을 얻으십시오.

Time(7) 열의 평균을 얻는 방법은 무엇입니까?

SQL 서버가 그러한 점을 고려한다고해도 이것들은 Timespans이고 시간상의 이산 점이 아니라고 덧붙일 것입니다!

+1

@ JustinPihony 나는 그것이 다르다고 생각합니다. 그 질문은 '시간'이 유효하기 전에 시간 값을 저장하는 varchar에 관한 것이며, 허용 된 응답과 몇 가지 다른 것들은 SQL Server 2008 + IMHO에서 최적의 솔루션이 아닙니다 ... –

답변

4

TIME은 기간이 아니기 때문에 시간을 평균화 할 수 없습니다. 나는 두 가지 접근법 중 하나를 제안한다.

  1. 선호하는 방법 : 당신이 무엇을 밀리 초, 마이크로 초, 나노초의 정수로 저장 기간입니다. 필요한 경우 훨씬 더 정밀하게 처리 할 수 ​​있습니다.

  2. 실제 시간 값 대신 자정부터 평균을 계산할 수 있도록 앞뒤로 변환을 적용하십시오.

DECLARE @x TABLE (ProcessTime TIME(7)); 

INSERT @x VALUES ('00:00:00.0000012'), ('00:00:00.0000016'); 

SELECT DATEADD(NANOSECOND, AVG(DATEDIFF(NANOSECOND, '00:00:00.0000000', ProcessTime)), 
    CONVERT(TIME, '00:00:00.0000000')) 
FROM @x; 

결과 :

00:00:00.0000014 

그러나 당신에게 잘못하지 않는 것? 특정 시점을 저장하지 않고 기간 만 염려한다면 기간을 저장하십시오. 언제든지 표시 할 때 시간 형식을 지정할 수 있습니다.

+0

안녕하세요 Aaron; 그들은 간격이 있습니다. 해당 상층 Entity Framework (.NET) 데이터 형식은 Timespan! 그래서 AVG 목적을 위해 간격을 정수로 변환해야한다고 가정합니다. 나는 네가 그곳에서 해낸 일이라고 생각한다. 나는 그걸 줄 것이다. 감사합니다 –

+0

완벽한 ... 당신을위한 골드 스타 Aaron –

+1

간격은 아직 SQL Server에서 구현되지 않습니다; 그래서 당신이 그것을 시간으로 저장할 때, SQL Server는 그것을보고 그것을 특정 시점으로 취급합니다. 향후 버전의 SQL Server에서 간격을두고 싶다면 다음 Connect 항목에 투표로 비즈니스 케이스를 주석으로 추가하십시오. http://connect.microsoft.com/SQLServer/feedback/details/432281/sql-server -doesnt-have-ansi-interval-data-type –