2012-10-09 42 views
0

我們搞砸了應用程序端,並在一列中加載了一些不正確的數據。現在我們需要修復這些數據..這是我們需要做的。時間數據修復

Starttime      Answertime 

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

Answertime比啓動時間多3小時,這是不正確的。現在我們需要的是在answertime和startime之間找到的差異,並將其添加到starttime。因此,對於以上2012-08-30 00:40:53.000將是新的回答。

有點困惑,在如何做到這一點。使用SQL Server 2008 R2

+0

「Answertime」總是精確地關閉3小時嗎?如果是這樣,那是一個簡單的修復。如果你只用秒,那麼當每個值的分鐘不同時會發生什麼? – RedFilter

+0

是的..這就是問題..小時差異並不總是3小時,並且需要考慮分鐘差異。 – 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 

答案的要點是,離開分鐘:Seconds.MilliSecs不談,answertime放入同一時間的開始時間。它還修復了第二行等邊界情況,其中更改使其早於啓動時間。

0

假設你想忽略除秒之外的所有內容,但處理差異超過一分鐘的情況。

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