문제

SQL Sever 2005에는 "HH : MM"Ss.mmmm "형식의 시간 값을 저장하는 Varchar 필드가 있습니다.

내가 정말로하고 싶은 것은 해당 시간 값의 내장 골재 기능을 사용하여 평균을 취하는 것입니다. 그러나 이것은 :

SELECT AVG(TimeField) FROM TableWithTimeValues

(물론) SQL은 평균적인 바르 르 차를 제공하지 않기 때문에 작동하지 않습니다. 그러나 이것

SELECT AVG(CAST(TimeField as datetime)) FROM TableWithTimeValues

또한 작동하지 않습니다. 내가 알 수 있듯이 SQL은 시간과 날짜가없는 시간으로 값을 변환하는 방법을 모릅니다. 나는 SQL이 해당 필드를 DateTime으로 바꾸도록 다양한 것들을 시도했지만 지금까지는 운이 없습니다.

누구든지 더 나은 방법을 제안 할 수 있습니까?

도움이 되었습니까?

해결책

SQL Server는 DateTime 값의 시간 전용 부분을 String에서 DateTime으로 변환 할 수 있지만 예에서는 4 진수 자리의 정밀도가 있습니다. SQL Server 2005는 3 개의 장소 만 인식합니다. 따라서, 당신은 가장 올바른 캐릭터를 잘라야합니다.

create table #TableWithTimeValues
(
    TimeField varchar(13) not null
)

insert into #TableWithTimeValues
select '04:00:00.0000'
union all
select '05:00:00.0000'
union all
select '06:00:00.0000'

SELECT CAST(TimeField as datetime) FROM #TableWithTimeValues
--Msg 241, Level 16, State 1, Line 1
--Conversion failed when converting datetime from character string.

SELECT CAST(LEFT(TimeField, 12) as datetime) FROM #TableWithTimeValues
--Success!

이것은 유효한 값을 1900-01-01에서 시작하는 DateTime으로 변환됩니다. SQL Server는 1 일 = 1 (정수)에 따라 날짜를 계산합니다. 날의 일부는 값 1의 일부입니다 (즉 정오는 0.5). 전환에 날짜가 지정되지 않았기 때문에 SQL Server는 0 일 (1900-01-01)의 값을 할당하여 시간 부분을 평균해야 할 필요성을 수용했습니다.

DateTime에서 AVG 작업을 수행하려면 먼저 DateTime을 소수점 값으로 변환하고 집계를 수행 한 다음 다시 캐스트해야합니다. 예를 들어

SELECT CAST(AVG(CAST(CAST(LEFT(TimeField, 12) as datetime) AS FLOAT)) AS DATETIME) FROM #TableWithTimeValues
--1900-01-01 05:00:00.000

이것을 여분의 소수점 자리로 저장 해야하는 경우, 시간 부분을 시간 부분 만있는 바르 차로 변환하고 문자열을 13 자로 다시 채울 수 있습니다.

SELECT CONVERT(VARCHAR, CAST(AVG(CAST(CAST(LEFT(TimeField, 12) as datetime) AS FLOAT)) AS DATETIME), 114) + '0' FROM #TableWithTimeValues

다른 팁

이 시도

AVG(CAST(CAST('1900-01-01 ' + TimeField AS DateTime) AS Float))

어쨌든 DateTime 열에 저장해야합니다. 해당 부분의 일관된 날짜 만 사용하십시오 (1/1/1900은 매우 일반적입니다). 그런 다음 avg ()에게 전화하여 걱정하지 않아도됩니다.

나는 Cadaeic의 응답을 사용하여 내가 찾고 있던 답을 얻었으므로 코드를 공유해야한다고 생각했습니다 ....

나는 모든 시간을 함께 평균화하고 모든 승인을 위해 전반적으로 전반적으로 회전 할 수있는 쿼리를 찾고있었습니다. 아래는 개별 ID에 대한 AVG TAT를 제공하고 전체 TAT를 중첩시킬 때 중첩 된 진술입니다.

SELECT 
-- calculates overall TAT for ALL Approvals for specified period of time
-- depending on parameters of query
CONVERT(VARCHAR, CAST(AVG(CAST(CAST(LEFT(Tat_mins, 12) as datetime) AS FLOAT)) AS DATETIME), 108) + '0'

from 
(
-- tat is for individual approvals 
SELECT 
dbo.credit_application.decision_status,
dbo.credit_application.application_id,
cast(dbo.credit_application.data_entry_complete as date) as'Data Entry Date',
cast(dbo.credit_application.decision_date as DATE) as 'Decision Date',
avg(datediff(minute, dbo.credit_application.data_entry_complete, dbo.credit_application.decision_date)) as 'TAT Minutes',
convert (char(5), DateAdd(minute, Datediff(minute,dbo.credit_application.data_entry_complete, dbo.credit_application.decision_date),'00:00:00'),108) as 'TAT_Mins'
FROM  dbo.credit_application
where Decision_status not in ('P','N')

group by dbo.credit_application.decision_status,
dbo.credit_application.data_entry_complete,
dbo.credit_application.decision_date
--dbo.credit_application.application_id
)bb

DateTime에서 평균을 어떻게 생각하십니까?

일정 기간 (시간?)까지 그룹화되어야하고 (*)를 표시해야한다고 생각하십니까?

SQL Server는 DateTime 데이터를 2 개의 4 바이트 정수로 저장하므로 DateTime은 8 바이트를 가져옵니다. 첫 번째는 기본 날짜 이후의 날과 두 번째는 자정 이후 밀리 초입니다.

DateTime 값을 정수로 변환하고 수학적 연산을 수행 할 수 있지만 변환은 DateTime 값의 "일"부분을 반환합니다 (예 : select convert) (int, getDate ()). "시간"부분을 정수로 반환하는 것이 더 어렵습니다.

SQL Server 2008을 사용하는 옵션입니까? 그 버전에는 새로운 것이 있습니다 전용 시간 데이터 유형.

고마워요, 앤디.

나는 모든 날짜와 임의의 지점 (01/01/1900)의 차이를 해결하고 평균 한 다음 다시 임의의 지점에 다시 추가합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top