Sql 时态数据修复

Sql 时态数据修复,sql,sql-server-2008,Sql,Sql Server 2008,我们在应用程序端搞砸了,在一列中加载了一些不正确的数据。。现在我们需要修复这些数据。。这是我们需要做的 Starttime Answertime 2012-08-30 00:40:40.000 2012-08-30 03:40:53.000 回答时间比开始时间多3个小时,这是不正确的。现在我们需要的是找出answertime和startime之间的秒差,并将其添加到starttime中。因此,对于以上2012-08-30 00:40:53.

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

Starttime                      Answertime

2012-08-30 00:40:40.000      2012-08-30 03:40:53.000
回答时间比开始时间多3个小时,这是不正确的。现在我们需要的是找出answertime和startime之间的秒差,并将其添加到starttime中。因此,对于以上2012-08-30 00:40:53.000将是新的回答时间

现在有点困惑怎么做。使用SQLServer2008R2

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

答案的要点是,把分:秒。毫秒放在一边,回答时间与开始时间放在同一个小时内。它还修复了边缘情况,如第二行,更改使其早于开始时间。

假设您想忽略除秒以外的所有内容,但处理差异超过一分钟的情况

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

Answertime
是否始终精确关闭3小时?如果是这样,这是一个简单的解决方案。如果只按秒计算,那么当每一个值的分钟数不同时会发生什么情况?是的。。这就是问题所在。。小时差异并不总是3小时,也需要考虑分钟差异。如果你需要考虑分钟差异,那么你也需要考虑小时差异。和日、月、年:)例如,
Starttime='2012-12-31 11:59:59'