2017-01-05 1 views
0

[평균 응답 시간]이라는 날짜/시간 필드가있는 테이블이 있습니다. 특정 레코드의 경우 시간은 다음과 같이 잘못 표시됩니다.수정 시간

1899-12-30 01:04:00.000 
1899-12-30 01:05:00.000 
1899-12-30 01:30:00.000 

여기에 표시된 시간은 잘못되었습니다. 위에 표시된 시간은 작은 샘플과 같지만 시간과 분이 아닌 분 초로 포맷해야합니다.

데이터를 다시 추출하여 해결할 수 있으므로 SQL 스크립트로이를 수정할 수 있습니까? 매우 어렵고 시간이 많이 걸립니다.

+1

하지만 어떻게 당신이 그 * 일정 * 기록이 식별 할 수 있습니까? – GurV

+0

Minutes to Seconds 및 Hour to Minutes 값을 이동 하시겠습니까? –

+0

맞음 시간을 00:01:30으로 표시하고 현재 01:30:00으로 표시하고 분을 초로 표시하려고합니다. 특정 레코드를 식별하는 방법에 대해서는 확신 할 수 없지만 알아낼 수있는 레코드입니다. – Tom

답변

1

당신은 DATEPART를 사용할 수 있습니다

은 지정된 날짜의 지정된 datepart를 나타내는 정수를 반환합니다. DATEADD과 결합

:

가 지정된 간격 (부호있는 정수)로 지정된 날짜를 반환은 해당 날짜의 지정된 날짜 부분에 추가됩니다.

예 :이 00:00:00 시간을 설정하기 위해 다시 datetime하는 시간 부분을 제거하기 위해, date의 값 캐스트

DECLARE @val AS DATETIME = '1899-12-30 01:30:00.000'; 

SELECT @val; -- 1899-12-30 01:30:00.000 

SET @val = DATEADD(SECOND, DATEPART(MINUTE, @val), 
        DATEADD(MINUTE, (DATEPART(HOUR, @val)), 
          CAST(CAST(@val AS DATE) AS DATETIME))); 

SELECT @val; -- 1899-12-30 00:01:30.000 

. 그런 다음 분 값을 기준으로시 값과 초를 기준으로 분을 더합니다.

UPDATE 문과 함께 사용할 수 있지만 의도하지 않는 한 모든 내용을 업데이트하지 않으려면 WHERE 절을 사용해야합니다.

예 업데이트 쿼리 :

CREATE TABLE #temp 
    (
     AvgTimeToAnswer DATETIME 
    ); 

INSERT INTO #temp 
     (AvgTimeToAnswer) 
VALUES ('1899-12-30 01:30:00.000'); 

SELECT * 
FROM #temp; -- 1899-12-30 01:30:00.000 

UPDATE #temp 
SET  AvgTimeToAnswer = DATEADD(SECOND, DATEPART(MINUTE, AvgTimeToAnswer), 
           DATEADD(MINUTE, 
             (DATEPART(HOUR, AvgTimeToAnswer)), 
             CAST(CAST(AvgTimeToAnswer AS DATE) AS DATETIME))); 
-- WHERE some condition 

SELECT * 
FROM #temp; -- 1899-12-30 00:01:30.000 

DROP TABLE #temp;