时态数据修复

时间:2012-10-09 18:41:59

标签: sql sql-server-2008

我们在应用程序方面搞砸了,并在一列中加载了一些不正确的数据。现在我们需要修复这些数据。这是我们需要做的。

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

2 个答案:

答案 0 :(得分: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

答案的要点是将Minutes:Seconds.MilliSecs放在一边,将answertime放入与开始时间相同的小时。它还修复了第二行的边缘情况,其中更改使其早于启动时间。

答案 1 :(得分: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