2012-10-09 3 views
0

우리는 응용 프로그램 측면에서 엉망이되어 하나의 열에 잘못된 데이터를로드했습니다. 이제이 데이터를 수정해야합니다. 여기에 우리가해야 할 일이 있습니다.임시 데이터 수정

Starttime      Answertime 

2012-08-30 00:40:40.000  2012-08-30 03:40:53.000 

답신 시간이 시작 시간보다 3 시간 이상 길었습니다. 이제 우리는 응답 시간과 시작 시간 사이에 의 차이점을 찾아이를 시작 시간에 추가해야합니다. 따라서 2012-08-30 00 : 40 : 53.000 이상으로 새 응답 시간이 적용됩니다.

현재 어떻게해야 할 지 혼란 스럽습니다. 옆 Seconds.MilliSecs의 answertime가 STARTTIME 같은 시간에 투입 : SQL 서버 2008 R2

+0

'답변 시간'은 항상 정확히 3 시간 정도입니까? 그렇다면 간단합니다. 초 단위로 이동하는 경우 각 값마다 분이 달라지면 어떻게됩니까? – RedFilter

+0

옙 .. 그 질문입니다. 시간 차이는 항상 3 시간이 아니며 분 diff도 고려해야합니다. – user1679411

+0

분당 계정이 필요한 경우 시간 차이를 고려해야합니다. 그리고 일, 월, 년 :) 예 :'Starttime = '2012-12-31 11 : 59 : 59'' – RedFilter

답변

0
declare @t table (
    Starttime datetime, 
    Answertime datetime); 
insert @t values (
    '2012-08-30 00:40:40.000','2012-08-30 03:40:53.000'),(
    '2012-08-30 00:59:59.900','2012-08-30 03:00:03.000'); 

update @t set Answertime = 
    case when dateadd(hh,datediff(hh,answertime,starttime),answertime) > starttime 
     then dateadd(hh,datediff(hh,answertime,starttime),answertime) 
     else dateadd(hh,datediff(hh,answertime,starttime)+1,answertime) end 
where Answertime > DateAdd(hh,1,StartTime); -- more than 1 hour apart 

select * from @T; 

>> 
STARTTIME     ANSWERTIME 
August, 30 2012 00:40:40 August, 30 2012 00:40:53 
August, 30 2012 00:59:59 August, 30 2012 01:00:03 

대답의 요지를 사용하면 떠나는 분은 있다는 것입니다. 또한 변경으로 인해 시작 시간보다 앞당겨지는 두 번째 행과 같은 가장자리 케이스가 수정됩니다.

0

초를 제외한 모든 것을 무시하고 차이가 1 분 넘는 경우를 처리한다고 가정합니다.

Update timetable set Answertime = 
case when DatePart(ss,Answertime) >= DatePart(ss,Starttime) 
    then dateAdd(ss, DatePart(ss,Answertime)-DatePart(ss,starttime),Starttime) 
else 
    dateAdd(ss, 60+DatePart(ss,Answertime)-DatePart(ss,Starttime),Starttime) 
end 
+0

감사합니다 .. 위의 스크립트가 작동했습니다. – user1679411